zoukankan      html  css  js  c++  java
  • Java进阶知识03 Struts2下的拦截器(interceptor)和 过滤器(Filter)

    一、拦截器  

    1.1、首先创建一个拦截器类  

     1 package com.bw.bms.interceptor;
     2 
     3 import com.opensymphony.xwork2.ActionContext;
     4 import com.opensymphony.xwork2.ActionInvocation;
     5 import com.opensymphony.xwork2.ActionProxy;
     6 import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
     7 
     8 /**
     9  * @author DSHORE/2019-9-5
    10  * 拦截器:拦截action
    11  */
    12 public class LoginInterceptor extends AbstractInterceptor {
    13 
    14     @Override   //对Action的方法的拦截(核心方法),注:这里,其他方法都删掉了,只留了核心方法
    15     public String intercept(ActionInvocation invocation) throws Exception {
    16         // 拿到当前执行的方法名,判断,只要当前方法名不是login,就要进行验证
    17         // 获取ActionContext对象
    18         ActionContext context = invocation.getInvocationContext();
    19         // 获取action的代理对象
    20         ActionProxy proxy = invocation.getProxy();
    21         // 获取当前执行的方法名
    22         String methodName = proxy.getMethod();
    23         // 判断
    24         //System.out.println("methodName:" + methodName);
    25         if (!"login".equals(methodName)) {
    26             // 先获取当前登录的用户
    27             String account = (String) context.getSession().get("account");
    28             System.out.println("account:" + account);
    29             if (account == null) { // 未登录
    30                 return "input";
    31             } else { // 当前用户已经登录
    32                 return invocation.invoke();   //invocation.invoke():返回值 success/error
    33             }
    34         } else {
    35             // 正在执行login操作
    36             return invocation.invoke();
    37         }
    38     }
    39 }

    1.2、配置拦截器 struts.xml 

     1 <?xml version="1.0" encoding="UTF-8" ?>
     2 <!DOCTYPE struts PUBLIC
     3     "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
     4     "http://struts.apache.org/dtds/struts-2.3.dtd">
     5 
     6 <struts>
     7     <!-- true支持动态方法调用 -->
     8     <constant name="struts.enable.DynamicMethodInvocation" value="true" />
     9     <constant name="struts.devMode" value="true" /> <!-- true -->
    10 
    11 
    12 
    13     <package name="manager" namespace="/manager" extends="struts-default">
    14 
    15 <!-- -------------------------------------------------------------- -->
    16         <!-- 【拦截器配置,开始】 -->
    17         <interceptors>
    18             <!-- 配置用户自定义的拦截器 -->
    19             <interceptor name="loginInterceptor" class="com.bw.bms.interceptor.LoginInterceptor"></interceptor>
    20             <!-- 自定义一个栈: 要引用默认栈、自定义的拦截器 -->
    21             <interceptor-stack name="loginStack">
    22                 <!-- 引用默认栈 (一定要放到第一行) -->
    23                 <interceptor-ref name="defaultStack"></interceptor-ref>
    24                 <!-- 引用自定义拦截器 -->
    25                 <interceptor-ref name="loginInterceptor"></interceptor-ref>
    26                 <!-- 指定拦截哪些方法需要防止表单重复提交(add) -->
    27                 <interceptor-ref name="token">
    28                     <param name="includeMethods">login,add,update,delete</param>   <!-- excludeMethods:指定哪些不拦截 -->
    29                 </interceptor-ref>
    30             </interceptor-stack>
    31         </interceptors>  <!-- 【拦截器配置,结束】 -->
    32 
    33         <!-- 【执行拦截器】 -->
    34         <default-interceptor-ref name="loginStack"></default-interceptor-ref>
    35 <!-- -------------------------------------------------------------- -->
    36 
    37         <action name="*_*" class="com.bw.bms.action.{1}Action" method="{2}">
    38             <result name="success">/manager/{1}_{2}_Success.jsp</result><!-- 登陆成功、查询所有 -->
    39             <result name="error">/manager/{1}_{2}_Error.jsp</result><!-- 登录时,账号或密码错误 -->
    40             <result name="input" type="redirect">/index.jsp</result><!-- 用户不存在、注销成功、未登录转态 -->
    41             <result name="operateSuccess" type="redirectAction">Book_list</result><!-- 添加、删除、修改操作 -->
    42             <result name="update">/manager/Book_update.jsp</result><!-- 根据id查询指数据 -->
    43             
    44             <!-- 防止表单重复提交,第三步: 如果用户重复提交了跳转到指定的错误页面 -->
    45             <result name="invalid.token" type="redirectAction">Book_list</result>
    46         </action>
    47     </package>
    48 </struts>

    1.3、登录和注销的代码  

     1 package com.bw.bms.action;
     2 
     3 import java.util.Map;
     4 
     5 import com.bw.bms.model.Admin;
     6 import com.bw.bms.service.IAdminService;
     7 import com.bw.bms.service.impl.AdminService;
     8 import com.opensymphony.xwork2.ActionContext;
     9 import com.opensymphony.xwork2.ActionSupport;
    10 import com.opensymphony.xwork2.ModelDriven;
    11 
    12 /**
    13  * @author DSHORE/2019-9-5
    14  * 
    15  */
    16 public class AdminAction extends ActionSupport implements ModelDriven<Admin> {
    17     // 使用了模型驱动进行传参,对象必须创建
    18     private Admin admin = new Admin();
    19 
    20     IAdminService adminService = new AdminService();
    21 
    22     @Override
    23     public Admin getModel() {
    24         return admin;
    25     }
    26 
    27     //登录
    28     public String login() {
    29         String account = admin.getAccount().trim();
    30         String password = admin.getPassword().trim();
    31         Admin adm = adminService.findByAccount(account);
    32         if (adm == null) { // 用户不存在,重新登录
    33             return INPUT;
    34         } else {
    35             if (password.equals(adm.getPassword())) {
    36                 ActionContext.getContext().getSession().put("account", account);
    37                 return SUCCESS;
    38             } else { // 密码错误,重新登录
    39                 return ERROR;
    40             }
    41         }
    42     }
    43 
    44     //注销
    45     public String logout() {
    46         Map<String, Object> session = ActionContext.getContext().getSession();
    47         //String acc = (String) session.get("account");   //Map<"account","huang">
    48         if (session.get("account") != null) {
    49             session.remove("account");
    50         }
    51         return INPUT;
    52     }
    53 
    54     public Admin getAdmin() {
    55         return admin;
    56     }
    57 
    58     public void setAdmin(Admin admin) {
    59         this.admin = admin;
    60     }
    61 }

    1.4、其他代码(上方struts.xml配置文件中action里面相关的代码) 

     1 package com.bw.bms.action;
     2 
     3 import java.util.ArrayList;
     4 import java.util.List;
     5 
     6 import com.bw.bms.model.Book;
     7 import com.bw.bms.service.IBookService;
     8 import com.bw.bms.service.impl.BookService;
     9 import com.opensymphony.xwork2.ActionContext;
    10 import com.opensymphony.xwork2.ActionSupport;
    11 import com.opensymphony.xwork2.ModelDriven;
    12 import com.opensymphony.xwork2.util.ValueStack;
    13 
    14 /**
    15  * @author DSHORE/2019-9-5
    16  * 
    17  */
    18 public class BookAction extends ActionSupport implements ModelDriven<Book> {
    19     private Book book = new Book();
    20     private List<Book> books = new ArrayList<Book>();
    21 
    22     IBookService bookService = new BookService();
    23 
    24     //查询所有
    25     public String list() {
    26         books = bookService.listAll();
    27         return SUCCESS;
    28     }
    29 
    30     //添加
    31     public String add() {
    32         bookService.add(book);
    33         return "operateSuccess";
    34     }
    35     
    36     //删除
    37     public String delete() {
    38         Integer id = book.getId();
    39         bookService.delete(id);
    40         return "operateSuccess";
    41     }
    42     
    43     //查询指定id的数据(执行修改操作前,需要先查询出要修改的那条数据)
    44     public String toUpdate() {
    45         Integer id = book.getId();
    46         Book updateBook = bookService.findById(id);
    47         ValueStack valueStack = ActionContext.getContext().getValueStack();// 先进后出
    48         valueStack.pop(); // 移除栈顶元素
    49         valueStack.push(updateBook); // 压栈
    50         return "update";
    51     }
    52 
    53     //修改
    54     public String update() {
    55         bookService.update(book);
    56         return "operateSuccess";
    57     }
    58 
    59     @Override
    60     public Book getModel() {
    61         return book;
    62     }
    63 
    64     public Book getBook() {
    65         return book;
    66     }
    67 
    68     public void setBook(Book book) {
    69         this.book = book;
    70     }
    71 
    72     public List<Book> getBooks() {
    73         return books;
    74     }
    75 
    76     public void setBooks(List<Book> books) {
    77         this.books = books;
    78     }
    79 }

    二、过滤器  

    2.1、自定义一个过滤器(和上面的拦截器是一套代码里面的)  

    EntranceFilter.Java 类

     1 package com.bw.bms.filter;
     2 
     3 import java.io.IOException;
     4 
     5 import javax.servlet.Filter;
     6 import javax.servlet.FilterChain;
     7 import javax.servlet.FilterConfig;
     8 import javax.servlet.ServletException;
     9 import javax.servlet.ServletRequest;
    10 import javax.servlet.ServletResponse;
    11 import javax.servlet.http.HttpServletRequest;
    12 import javax.servlet.http.HttpServletResponse;
    13 import javax.servlet.http.HttpSession;
    14 
    15 /**
    16  * @author DSHORE/2019-9-5
    17  * 过滤器:过滤页面(jsp、html等页面)
    18  */
    19 public class EntranceFilter implements Filter {
    20 
    21     @Override
    22     public void destroy() {
    23         // TODO Auto-generated method stub
    24     }
    25 
    26     @Override
    27     public void doFilter(ServletRequest request, ServletResponse response,
    28             FilterChain chain) throws IOException, ServletException {
    29         HttpServletRequest servletRequest = (HttpServletRequest) request;
    30         HttpServletResponse servletResponse = (HttpServletResponse) response;
    31         HttpSession session = servletRequest.getSession();
    32 
    33         // 获得用户请求的URI
    34         String path = servletRequest.getRequestURI();
    35         System.out.println("###########path:" + path);
    36         // 从session里取
    37         String account = (String) session.getAttribute("account");
    38         // 判断当前的jsp是否是index.jsp,如果是放行,否则的话:(1)已经登录——放行、(2)未登录——index.jsp
    39         if ((path.indexOf("login.action") > -1 ) || (path.indexOf("index.jsp") > -1 )) {
    40             /**
    41              * index.jsp 不需要过过滤  Admin_login.action 不需要过过滤,
    42              * Admin_login_Success.jsp 需要过滤,不允许进来 Admin_login_Error.jsp
    43              */
    44             System.out.println("!!!!!!!!!!!!!path:" + path);
    45             chain.doFilter(servletRequest, servletResponse);
    46             return;
    47         } else {
    48             // 判断如果没有取到管理员信息,就跳转到登陆页面
    49             if (account == null || "".equals(account)) { // account.equals("")错误
    50                 // 跳转到登陆页面
    51                 String basePath = request.getScheme() + "://"
    52                         + request.getServerName() + ":"
    53                         + request.getServerPort()
    54                         + ((HttpServletRequest) request).getContextPath();
    55                 servletResponse.sendRedirect(basePath + "/index.jsp");
    56             } else { // 通过
    57                 // 已经登陆,继续此次请求
    58                 chain.doFilter(request, response);
    59             }
    60         }
    61     }
    62 
    63     @Override
    64     public void init(FilterConfig arg0) throws ServletException {
    65         // TODO Auto-generated method stub
    66     }
    67 }

    web.xml 配置文件

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
     3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     4     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
     5     http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
     6     <display-name></display-name>
     7     <welcome-file-list>
     8         <welcome-file>index.jsp</welcome-file>
     9     </welcome-file-list>
    10     
    11     <filter><!--  自定义过滤器  开始-->
    12         <filter-name>EntranceFilter</filter-name>
    13         <filter-class>com.bw.bms.filter.EntranceFilter</filter-class>
    14     </filter>
    15     <filter-mapping>
    16         <filter-name>EntranceFilter</filter-name>
    17         <url-pattern>/*</url-pattern>
    18         <url-pattern>/manager/*</url-pattern>
    19     </filter-mapping><!--  自定义过滤器  结束-->
    20     
    21     <filter>
    22         <filter-name>struts2</filter-name>
    23         <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
    24     </filter>
    25     <filter-mapping>
    26         <filter-name>struts2</filter-name>
    27         <url-pattern>/*</url-pattern>
    28     </filter-mapping>
    29 </web-app>

    Servlet下的过滤器(filter)

    原创作者:DSHORE

    作者主页:http://www.cnblogs.com/dshore123/

    原文出自:https://www.cnblogs.com/dshore123/p/11469227.html

    欢迎转载,转载务必说明出处。(如果本文对您有帮助,可以点击一下右下角的 推荐,或评论,谢谢!

  • 相关阅读:
    spring cloud 和 阿里微服务spring cloud Alibaba
    为WPF中的ContentControl设置背景色
    java RSA 解密
    java OA系统 自定义表单 流程审批 电子印章 手写文字识别 电子签名 即时通讯
    Hystrix 配置参数全解析
    spring cloud 2020 gateway 报错503
    Spring Boot 配置 Quartz 定时任务
    Mybatis 整合 ehcache缓存
    Springboot 整合阿里数据库连接池 druid
    java OA系统 自定义表单 流程审批 电子印章 手写文字识别 电子签名 即时通讯
  • 原文地址:https://www.cnblogs.com/dshore123/p/11469227.html
Copyright © 2011-2022 走看看