一、拦截器

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)的更多相关文章

  1. struts2的拦截器(Interceptor)与过滤器(Filter)

    一.拦截器与过滤器的区别: 1.filter基于回调函数,我们需要实现的filter接口中doFilter方法就是回调函数,而interceptor则基于Java本身的反射机制,这是两者最本质的区别. ...

  2. Java进阶知识01 Struts2下的 jquery+ajax+struts 技术实现异步刷新功能

    1.效果图示 横线上方的部分不动(没有刷新),下方实现刷新(异步刷新) 2.实现步骤 jquery+ajax+struts技术实现异步刷新功能的步骤:    1.需要用到 jquery+ajax+st ...

  3. struts2学习笔记--拦截器(Interceptor)和登录权限验证Demo

    理解 Interceptor拦截器类似于我们学过的过滤器,是可以在action执行前后执行的代码.是我们做web开发是经常使用的技术,比如权限控制,日志.我们也可以把多个interceptor连在一起 ...

  4. Java进阶知识04 Struts2的基础配置详解

    1.Struts2的原理/流程步骤 简单的理解:    1.客户端发送一个request请求,Tomcat服务器接收到的请求经过web.xml配置文件去处理,进入struts2的核心过滤器,从而进入s ...

  5. Java进阶知识19 Struts2和Spring整合在一起

    1.概述 1.Spring负责对象创建  2.Struts2负责用Action处理请求  3.整合的关键点:让Struts2框架Action对象的创建交给Spring完成. 2.整合实例 需要用到的 ...

  6. Java进阶知识14 Struts2中的S标签

    1.A 开头 <s:a href=""></s:a> //超链接,类似于html里的<a></a> <s:action nam ...

  7. 拦截器(Inteceptor),过滤器(Filter),切面(Aspect)处理HttpServiceReqeust请求

    1.拦截器 java里的拦截器是动态拦截Action调用的对象.它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行,同时也提供了一种可 ...

  8. 拦截器Interceptor和过滤器Filter的区别

    (1)过滤器(Filter):当你有一堆东西的时候,你只希望选择符合你要求的某一些东西.定义这些要求的工具,就是过滤器.(理解:就是一堆字母中取一个B) (2)拦截器(Interceptor):在一个 ...

  9. struts2中方法拦截器(Interceptor)的中的excludeMethods与includeMethods的理解

    http://www.cnblogs.com/langtianya/archive/2013/04/10/3012205.html

随机推荐

  1. HTML DOM focus() 方法

    目录 HTML DOM focus() 方法 实例 定义和使用 浏览器支持 语法 参数 技术描述 更多实例 实例 实例 HTML DOM focus() 方法 实例 为 <a> 元素设置焦 ...

  2. hadoop-InputFormat-Split-任务并行度

    首先来看 MapReduce 流程图 一个 map,一个 reduce,中间靠 shuffle 连接,shuffle 左边被划分到 map,右边被划分到 reduce InputFormat inpu ...

  3. Feign的雪崩处理

    在声明式远程服务调用Feign中,实现服务灾难性雪崩效应处理也是通过Hystrix实现的.而feign启动器spring-cloud-starter-feign中是包含Hystrix相关依赖的.如果只 ...

  4. spring boot 学习笔记(三)之 配置

    一:概述 在Spring boot 中根据业务需求,我们往往会在不同地方配置我们所需的key-value 配置项,配置文件存在不同的地方的场景如下: (1) 默认存在 application.prop ...

  5. (四)创建基于maven的javaFX+springboot项目,用户界面与后台逻辑分离方式

    下面来介绍创建maven的javaFX+springboot项目,基于用户界面与后天逻辑分离的方式,用户界面使用fxml文件来常见,类似于jsp,可以引入css文件修饰界面 maven依赖 <d ...

  6. HTML的学习2(注释)

    <!--链接标签--> <!--核心属性就是href 属性值可以是一个跳转的地址--> <a href="">可点击的文本</a> ...

  7. 关于Webpack打包报错Class constructor FileManager cannot be invoked without 'new'

    前端代码部署一直是自己打包之后将文件用FileZilla上传到服务器上,现在改用运维基于到k8s docker镜像的发布,前端打包报错如下: 经查资料,报错原因是less升级导致的Bug 尝试升级le ...

  8. windows2012获取明文密码

    windows 2012获取明文密码 导hash的话用常规的方法就可以. 修改注册表 reg add HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Contr ...

  9. kbmMWClientQuery判断一个字段是否修改?

    function TForm5.IsFieldChanged(aDataSet: TkbmMWCustomClientQuery; aFieldName: string): Boolean; var ...

  10. 关于同一台服务器上两个PHP项目相互访问超时的问题

    当一台服务器部署多个PHP项目,各自运行时并无干扰, 即使都使用 9000端口来跑php 但是有一种情况,当其中一个项目需要调用另一个php项目的接口时,便会超时,这是因为php是单线程的同步的 也许 ...