一个过滤器不仅解决了会话标识未更新同时还顺带解决了已解密的登录请求
2016-08-31 16:43
363 查看
废话不多说直接上代码,少点套路,多点真诚。
过滤器代码如下:
web.xml配置如下:
过滤器代码如下:
package com.filter; import java.io.IOException; import java.util.Enumeration; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Map.Entry; 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.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * * 会话标识未更新 * */ public class NewSessionFilter extends HttpServlet implements Filter { /** * */ private static final long serialVersionUID = 831349987977760012L; static ServletRequest request; private String url; private static final Logger logger = LoggerFactory.getLogger(NewSessionFilter.class); public static final String NEW_SESSION_INDICATOR = "com.filter.NewSessionFilter"; static HttpServletRequest request2 = (HttpServletRequest) request; public static void newSession(){ HttpSession session = request2.getSession(true); session.setAttribute(NEW_SESSION_INDICATOR, true); } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { //System.out.println("NewSessionFilter doFilter"); if (request instanceof HttpServletRequest) { HttpServletRequest httpRequest = (HttpServletRequest) request; //取的url相对地址 String url = httpRequest.getRequestURI(); System.out.println(url); if (httpRequest.getSession() != null) { System.out.println("NewSessionFilter doFilter httpRequest.getSession().getId()"+ httpRequest.getSession().getId()); //--------复制 session到临时变量 HttpSession session = httpRequest.getSession(); HashMap old = new HashMap(); Enumeration keys = (Enumeration) session.getAttributeNames(); while (keys.hasMoreElements()){ String key = (String) keys.nextElement(); if (!NEW_SESSION_INDICATOR.equals(key)){ old.put(key, session.getAttribute(key)); session.removeAttribute(key); } } if (httpRequest.getMethod().equals("POST") && httpRequest.getSession() != null && !httpRequest.getSession().isNew() && httpRequest.getRequestURI().endsWith(url)){ session.invalidate(); session=httpRequest.getSession(true); logger.debug("new Session:" + session.getId()); } //-----------------复制session for (Iterator it = old.entrySet().iterator(); it.hasNext();) { Map.Entry entry = (Entry) it.next(); session.setAttribute((String) entry.getKey(), entry.getValue()); } } } chain.doFilter(request, response); // System.out.println("NewSessionFilter doFilter end"); } @Override public void destroy() { // System.out.println("NewSessionFilter destory"); } @Override public void init(FilterConfig filterConfig) throws ServletException { // System.out.println("NewSessionFilter init"); //System.out.println("NewSessionFilter init end"); } }
web.xml配置如下:
<!--配置过滤器 会话标识未更新 过滤 --> <filter> <filter-name>NewSessionFilter</filter-name> <filter-class>com.filter.NewSessionFilter</filter-class> </filter> <!--映射过滤器--> <filter-mapping> <filter-name>NewSessionFilter</filter-name> <!--“/*”表示拦截所有的请求 --> <url-pattern>/*</url-pattern> </filter-mapping>
相关文章推荐
- 网络安全-已解密的登录请求,会话标识未更新,跨站点请求伪造
- 关于更新windows Service Pack 3 更新后系统登录出现“一个问题阻止Windows正确检查机器的许可证。错误代码 0x80070002”问题解决方案
- 使用https协议解决掉顽固不化的已解密的登录请求
- 解决shiro会话标识未更新问题
- 网站后台登录aspcms 提示错误号:-2147467259,错误描述:操作必须使用一个可更新的查询。sql=update AspCms_Content set TimeStatus=0 where TimeStatus=1 and Timeing <= 解决方法。
- Appscan检测结果:【已解密的登录请求】已解决
- vue解决一个方法同时发送多个请求的问题
- IE中ajax+jsp登录界面,由于缓存导致jsp过滤器与ajax请求被拦截的问题和解决
- Playframework - 如何解决两个JPA同时访问一个数据库但是不更新Model的id名字
- IE中ajax+jsp登录界面,由于缓存导致jsp过滤器与ajax请求被拦截的问题和解决
- Access中"操作必须使用一个可更新的查询"错误的解决办法
- 更新一个字段后,同时取得更新后的值。
- asp:(0X80004005)操作必须使用一个可更新的查询”错误的解决办法
- 如何解决ADO.NET访问Access数据库出现"操作必须使用一个可更新的查询"的问题
- 错误“操作必须使用一个可更新的查询”原因及解决办法
- 如何解决ADO.NET访问Access数据库出现"操作必须使用一个可更新的查询"的问题
- "操作必须使用一个可更新的查询"错误的解决方法
- 一个button同时执行多个有返回值的函数的解决方法(return false; or return true;)
- “[Microsoft][ODBC Microsoft Access Driver] 操作必须使用一个可更新的查询”的解决办法
- ASP.NET防止同一个帐号多个用户同时登陆的解决方法