Java进阶知识02 Struts2下的拦截器(interceptor)和 过滤器(Filter)
一、拦截器
1.1、首先创建一个拦截器类
package com.bw.bms.interceptor; import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.ActionProxy;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor; /**
* @author DSHORE/2019-9-5
* 拦截器:拦截action
*/
public class LoginInterceptor extends AbstractInterceptor { @Override //对Action的方法的拦截(核心方法),注:这里,其他方法都删掉了,只留了核心方法
public String intercept(ActionInvocation invocation) throws Exception {
// 拿到当前执行的方法名,判断,只要当前方法名不是login,就要进行验证
// 获取ActionContext对象
ActionContext context = invocation.getInvocationContext();
// 获取action的代理对象
ActionProxy proxy = invocation.getProxy();
// 获取当前执行的方法名
String methodName = proxy.getMethod();
// 判断
//System.out.println("methodName:" + methodName);
if (!"login".equals(methodName)) {
// 先获取当前登录的用户
String account = (String) context.getSession().get("account");
System.out.println("account:" + account);
if (account == null) { // 未登录
return "input";
} else { // 当前用户已经登录
return invocation.invoke(); //invocation.invoke():返回值 success/error
}
} else {
// 正在执行login操作
return invocation.invoke();
}
}
}
1.2、配置拦截器 struts.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd"> <struts>
<!-- true支持动态方法调用 -->
<constant name="struts.enable.DynamicMethodInvocation" value="true" />
<constant name="struts.devMode" value="true" /> <!-- true --> <package name="manager" namespace="/manager" extends="struts-default"> <!-- -------------------------------------------------------------- -->
<!-- 【拦截器配置,开始】 -->
<interceptors>
<!-- 配置用户自定义的拦截器 -->
<interceptor name="loginInterceptor" class="com.bw.bms.interceptor.LoginInterceptor"></interceptor>
<!-- 自定义一个栈: 要引用默认栈、自定义的拦截器 -->
<interceptor-stack name="loginStack">
<!-- 引用默认栈 (一定要放到第一行) -->
<interceptor-ref name="defaultStack"></interceptor-ref>
<!-- 引用自定义拦截器 -->
<interceptor-ref name="loginInterceptor"></interceptor-ref>
<!-- 指定拦截哪些方法需要防止表单重复提交(add) -->
<interceptor-ref name="token">
<param name="includeMethods">login,add,update,delete</param> <!-- excludeMethods:指定哪些不拦截 -->
</interceptor-ref>
</interceptor-stack>
</interceptors> <!-- 【拦截器配置,结束】 --> <!-- 【执行拦截器】 -->
<default-interceptor-ref name="loginStack"></default-interceptor-ref>
<!-- -------------------------------------------------------------- --> <action name="*_*" class="com.bw.bms.action.{1}Action" method="{2}">
<result name="success">/manager/{1}_{2}_Success.jsp</result><!-- 登陆成功、查询所有 -->
<result name="error">/manager/{1}_{2}_Error.jsp</result><!-- 登录时,账号或密码错误 -->
<result name="input" type="redirect">/index.jsp</result><!-- 用户不存在、注销成功、未登录转态 -->
<result name="operateSuccess" type="redirectAction">Book_list</result><!-- 添加、删除、修改操作 -->
<result name="update">/manager/Book_update.jsp</result><!-- 根据id查询指数据 --> <!-- 防止表单重复提交,第三步: 如果用户重复提交了跳转到指定的错误页面 -->
<result name="invalid.token" type="redirectAction">Book_list</result>
</action>
</package>
</struts>
1.3、登录和注销的代码
package com.bw.bms.action; import java.util.Map; import com.bw.bms.model.Admin;
import com.bw.bms.service.IAdminService;
import com.bw.bms.service.impl.AdminService;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven; /**
* @author DSHORE/2019-9-5
*
*/
public class AdminAction extends ActionSupport implements ModelDriven<Admin> {
// 使用了模型驱动进行传参,对象必须创建
private Admin admin = new Admin(); IAdminService adminService = new AdminService(); @Override
public Admin getModel() {
return admin;
} //登录
public String login() {
String account = admin.getAccount().trim();
String password = admin.getPassword().trim();
Admin adm = adminService.findByAccount(account);
if (adm == null) { // 用户不存在,重新登录
return INPUT;
} else {
if (password.equals(adm.getPassword())) {
ActionContext.getContext().getSession().put("account", account);
return SUCCESS;
} else { // 密码错误,重新登录
return ERROR;
}
}
} //注销
public String logout() {
Map<String, Object> session = ActionContext.getContext().getSession();
//String acc = (String) session.get("account"); //Map<"account","huang">
if (session.get("account") != null) {
session.remove("account");
}
return INPUT;
} public Admin getAdmin() {
return admin;
} public void setAdmin(Admin admin) {
this.admin = admin;
}
}
1.4、其他代码(上方struts.xml配置文件中action里面相关的代码)
package com.bw.bms.action; import java.util.ArrayList;
import java.util.List; import com.bw.bms.model.Book;
import com.bw.bms.service.IBookService;
import com.bw.bms.service.impl.BookService;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
import com.opensymphony.xwork2.util.ValueStack; /**
* @author DSHORE/2019-9-5
*
*/
public class BookAction extends ActionSupport implements ModelDriven<Book> {
private Book book = new Book();
private List<Book> books = new ArrayList<Book>(); IBookService bookService = new BookService(); //查询所有
public String list() {
books = bookService.listAll();
return SUCCESS;
} //添加
public String add() {
bookService.add(book);
return "operateSuccess";
} //删除
public String delete() {
Integer id = book.getId();
bookService.delete(id);
return "operateSuccess";
} //查询指定id的数据(执行修改操作前,需要先查询出要修改的那条数据)
public String toUpdate() {
Integer id = book.getId();
Book updateBook = bookService.findById(id);
ValueStack valueStack = ActionContext.getContext().getValueStack();// 先进后出
valueStack.pop(); // 移除栈顶元素
valueStack.push(updateBook); // 压栈
return "update";
} //修改
public String update() {
bookService.update(book);
return "operateSuccess";
} @Override
public Book getModel() {
return book;
} public Book getBook() {
return book;
} public void setBook(Book book) {
this.book = book;
} public List<Book> getBooks() {
return books;
} public void setBooks(List<Book> books) {
this.books = books;
}
}
二、过滤器
2.1、自定义一个过滤器(和上面的拦截器是一套代码里面的)
EntranceFilter.Java 类
package com.bw.bms.filter; import java.io.IOException; import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession; /**
* @author DSHORE/2019-9-5
* 过滤器:过滤页面(jsp、html等页面)
*/
public class EntranceFilter implements Filter { @Override
public void destroy() {
// TODO Auto-generated method stub
} @Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest servletRequest = (HttpServletRequest) request;
HttpServletResponse servletResponse = (HttpServletResponse) response;
HttpSession session = servletRequest.getSession(); // 获得用户请求的URI
String path = servletRequest.getRequestURI();
System.out.println("###########path:" + path);
// 从session里取
String account = (String) session.getAttribute("account");
// 判断当前的jsp是否是index.jsp,如果是放行,否则的话:(1)已经登录——放行、(2)未登录——index.jsp
if ((path.indexOf("login.action") > -1 ) || (path.indexOf("index.jsp") > -1 )) {
/**
* index.jsp 不需要过过滤 Admin_login.action 不需要过过滤,
* Admin_login_Success.jsp 需要过滤,不允许进来 Admin_login_Error.jsp
*/
System.out.println("!!!!!!!!!!!!!path:" + path);
chain.doFilter(servletRequest, servletResponse);
return;
} else {
// 判断如果没有取到管理员信息,就跳转到登陆页面
if (account == null || "".equals(account)) { // account.equals("")错误
// 跳转到登陆页面
String basePath = request.getScheme() + "://"
+ request.getServerName() + ":"
+ request.getServerPort()
+ ((HttpServletRequest) request).getContextPath();
servletResponse.sendRedirect(basePath + "/index.jsp");
} else { // 通过
// 已经登陆,继续此次请求
chain.doFilter(request, response);
}
}
} @Override
public void init(FilterConfig arg0) throws ServletException {
// TODO Auto-generated method stub
}
}
web.xml 配置文件
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<display-name></display-name>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list> <filter><!-- 自定义过滤器 开始-->
<filter-name>EntranceFilter</filter-name>
<filter-class>com.bw.bms.filter.EntranceFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>EntranceFilter</filter-name>
<url-pattern>/*</url-pattern>
<url-pattern>/manager/*</url-pattern>
</filter-mapping><!-- 自定义过滤器 结束--> <filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
Servlet下的过滤器(filter)
|
原创作者:DSHORE 作者主页:http://www.cnblogs.com/dshore123/ 原文出自:https://www.cnblogs.com/dshore123/p/11469227.html 欢迎转载,转载务必说明出处。(如果本文对您有帮助,可以点击一下右下角的 推荐,或评论,谢谢!) |
Java进阶知识02 Struts2下的拦截器(interceptor)和 过滤器(Filter)的更多相关文章
- struts2的拦截器(Interceptor)与过滤器(Filter)
一.拦截器与过滤器的区别: 1.filter基于回调函数,我们需要实现的filter接口中doFilter方法就是回调函数,而interceptor则基于Java本身的反射机制,这是两者最本质的区别. ...
- Java进阶知识01 Struts2下的 jquery+ajax+struts 技术实现异步刷新功能
1.效果图示 横线上方的部分不动(没有刷新),下方实现刷新(异步刷新) 2.实现步骤 jquery+ajax+struts技术实现异步刷新功能的步骤: 1.需要用到 jquery+ajax+st ...
- struts2学习笔记--拦截器(Interceptor)和登录权限验证Demo
理解 Interceptor拦截器类似于我们学过的过滤器,是可以在action执行前后执行的代码.是我们做web开发是经常使用的技术,比如权限控制,日志.我们也可以把多个interceptor连在一起 ...
- Java进阶知识04 Struts2的基础配置详解
1.Struts2的原理/流程步骤 简单的理解: 1.客户端发送一个request请求,Tomcat服务器接收到的请求经过web.xml配置文件去处理,进入struts2的核心过滤器,从而进入s ...
- Java进阶知识19 Struts2和Spring整合在一起
1.概述 1.Spring负责对象创建 2.Struts2负责用Action处理请求 3.整合的关键点:让Struts2框架Action对象的创建交给Spring完成. 2.整合实例 需要用到的 ...
- Java进阶知识14 Struts2中的S标签
1.A 开头 <s:a href=""></s:a> //超链接,类似于html里的<a></a> <s:action nam ...
- 拦截器(Inteceptor),过滤器(Filter),切面(Aspect)处理HttpServiceReqeust请求
1.拦截器 java里的拦截器是动态拦截Action调用的对象.它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行,同时也提供了一种可 ...
- 拦截器Interceptor和过滤器Filter的区别
(1)过滤器(Filter):当你有一堆东西的时候,你只希望选择符合你要求的某一些东西.定义这些要求的工具,就是过滤器.(理解:就是一堆字母中取一个B) (2)拦截器(Interceptor):在一个 ...
- struts2中方法拦截器(Interceptor)的中的excludeMethods与includeMethods的理解
http://www.cnblogs.com/langtianya/archive/2013/04/10/3012205.html
随机推荐
- Golang Module快速入门
前言: 在Golang1.11之前的版本中,官方没有提供依赖和包管理工具.开发者通常会使用vendor或者glide的方式来管理依赖(也有直接使用GOPATH多环境方式),而在Golang1.11之后 ...
- C++ 包含目录、库目录、附加包含目录、附加库目录、附加依赖项之详解(转)
最近因为接触机器学习,所有涉猎到C++方面的开发.在c++中有几个概念很迷糊. VS项目中的包含目录.库目录.附加包含目录.附加库目录.附加依赖项均在"项目->属性->配置属性& ...
- 老贾的幸福生活day 04
变量 变量名的规则: 变量名由字母,数字,下划线组成 变量名不能以数字开头 变量名要具有可描述性 变量名要区分大小写 变量名禁止使用python关键字 变量名不能使用中文和拼音 变量名推荐写法: 驼峰 ...
- MySQL安装及初级增删改查一
学习MYsql 是参照这个维C果糖的总结,学习目录网址:https://blog.csdn.net/qq_35246620/article/details/70823903,谢谢大神的无私分享. 一. ...
- 12-Perl 时间日期
1.Perl 时间日期本章节介绍 Perl 语言对时间日期的处理.Perl中处理时间的函数有如下几种: time() 函数:返回从1970年1月1日起累计的秒数 localtime() 函数:获取本地 ...
- JSTreeShaking的webpack-deep-scope-plugin插件的应用
webpack自身实现词法分析的JSTreeShaking webpack-depp-scope-plugin插件实现作用域分析的JSTreeShaking 一.webpack词法分析的JSTreeS ...
- httpclient 上传附件实例
httpclient 单附件上传实例 (扩展多附件上传实例,点我) /** * 上传附件 * @param host * @param uri * @param filePath 文件路径 * @p ...
- day8 socket
代码: 例子1:socket tcp 通讯 server端 import socketserver = socket.socket()ip_port = ("127.0.0.1", ...
- 创建LEANGOO项目
转自:https://www.leangoo.com/leangoo_guide/leangoo_guide_create_project.html#toggle-id-3 一个项目包括多个看板和多名 ...
- linux递归查找目录下所有文件夹以及文件
相对于ls或者ll,可能find在这个时候更加给力 先看我的目录结构 tree命令是查看目录的结构,而且最后会列出所有的directory的数目以及文件夹的数目...好像我们接下来要做的就没有必要了, ...