利用ThreadLocal管理request和session以及用户信息,实现 Use anywhere
来源:互联网 发布:al软件平面设计教程 编辑:程序博客网 时间:2024/06/06 00:04
1.我们有时需要获取request或session中的数据的时候,首先需要获取request和session对象,这个通常是在Controller的时候当做入参获取,这样方法的入参会显得很长很臃肿的感觉。这就是的出发点,接下来就展示一下是如何实现的。
2.首先我们写个一个拦截器:WebContextFilter
package com.office.common.filter;import java.io.IOException;import javax.servlet.FilterChain;import javax.servlet.ServletException;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.springframework.web.filter.OncePerRequestFilter;import com.office.common.context.WebContextHolder;/** * webcontent信息加载到TheadLocal中 * @author Neo * @date 2017年10月20日11:38:45 */public class WebContextFilter extends OncePerRequestFilter {public WebContextFilter() {}protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)throws ServletException, IOException {if (request == null || response == null) {return;} else {WebContextHolder.setRequest(request);WebContextHolder.setResponse(response);filterChain.doFilter(request, response);return;}}}
3.然后我们将写好的拦截器配置到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>Archetype Created Web Application</display-name><context-param><param-name>contextConfigLocation</param-name><param-value></param-value></context-param><filter><filter-name>encodingFilter</filter-name><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class><init-param><param-name>encoding</param-name><param-value>UTF-8</param-value></init-param><init-param><param-name>forceEncoding</param-name><param-value>true</param-value></init-param></filter><filter-mapping><filter-name>encodingFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping><!-- ******************************************************************* --><!-- *************** webcontent信息加载到TheadLocal中 ******************** --><!-- ******************************************************************* --><filter><filter-name>webContentFilter</filter-name><filter-class>com.office.common.filter.WebContextFilter</filter-class></filter><filter-mapping><filter-name>webContentFilter</filter-name><url-pattern>/*</url-pattern><!-- /* --></filter-mapping><listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener><servlet><servlet-name>springMVC</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>classpath*:applicationContext.xml</param-value></init-param><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>springMVC</servlet-name><url-pattern>/</url-pattern></servlet-mapping></web-app>
4.编写一个同一个管理操作工具类:WebContextHolder
package com.office.common.context;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import javax.servlet.http.HttpSession;import com.office.common.dto.UserDTO;/** * 上下文 * @author Neo * @date 2017年10月20日11:42:57 */@SuppressWarnings({ "rawtypes", "unchecked" })public class WebContextHolder {public WebContextHolder() {}public static String getRequestIp() {if (getRequest() == null)return null;HttpServletRequest request = getRequest();String ip = request.getHeader("X-Forwarded-For");if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip))ip = request.getHeader("Proxy-Client-IP");if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip))ip = request.getHeader("WL-Proxy-Client-IP");if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip))ip = request.getHeader("HTTP_CLIENT_IP");if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip))ip = request.getHeader("HTTP_X_FORWARDED_FOR");if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip))ip = request.getRemoteAddr();} else if (ip.length() > 15) {String ips[] = ip.split(",");int index = 0;do {if (index >= ips.length)break;String strIp = ips[index];if (!"unknown".equalsIgnoreCase(strIp)) {ip = strIp;break;}index++;} while (true);}return ip;}public static HttpServletRequest getRequest() {if (requestLocal == null)return null;elsereturn (HttpServletRequest) requestLocal.get();}public static String getContextPath() {if (getRequest() == null)return null;elsereturn (new StringBuilder()).append(getRequest().getContextPath()).append("/").toString();}public static String getCurrRequestURI() {if (getRequest() == null)return null;elsereturn (new StringBuilder()).append(getRequest().getRequestURI().replace(getRequest().getContextPath(), "")).append("/").toString();}public static HttpServletResponse getResponse() {if (responseLocal == null)return null;elsereturn (HttpServletResponse) responseLocal.get();}public static HttpSession getSession() {if (requestLocal == null)return null;if (requestLocal.get() == null)return null;elsereturn ((HttpServletRequest) requestLocal.get()).getSession();}public static UserDTO getLoginUserSession(Class loginUserClass) {if (getSession() == null)return null;Object obj = getSession().getAttribute(CURRENT_USER);if (obj == null)return null;elsereturn (UserDTO) obj;}public static UserDTO getLoginUserSession() {return getLoginUserSession(UserDTO.class);}public static void createLoginUserSession(UserDTO loginUser) {if (loginUser != null)getSession().setAttribute(CURRENT_USER, loginUser);}public static void destroyLoginUserSession() {if (getLoginUserSession() != null) {getSession().removeAttribute(CURRENT_USER);getSession().invalidate();}}public static void setRequest(HttpServletRequest request) {if (requestLocal == null)requestLocal = new ThreadLocal();requestLocal.set(request);}public static void setResponse(HttpServletResponse response) {if (responseLocal == null)responseLocal = new ThreadLocal();responseLocal.set(response);} /** * 获取项目请求的根目录 * * @return eg:http://localhost:8080/projectName */public static String getProjectRequestRootPath() {HttpServletRequest request = WebContextHolder.getRequest();StringBuffer sb = new StringBuffer();sb.append(request.getScheme()). append("://"). append(request.getServerName()). append(":"). append(request.getServerPort()). append(request.getContextPath()). append("/");return sb.toString();}private static ThreadLocal requestLocal;private static ThreadLocal responseLocal;public static String CURRENT_USER = "CURRENT_USER";}
5.使用展示:
//我们可以在任何地方使用这种方法取值WebContextHolder.getRequest().getParameter("id");
阅读全文
0 0
- 利用ThreadLocal管理request和session以及用户信息,实现 Use anywhere
- 利用ThreadLocal管理Hibernate Session
- 利用ThreadLocal管理Hibernate Session
- 利用ThreadLocal模式管理Session
- 利用ThreadLocal模式管理Session
- ThreadLocal 与 Request 和 Session 之关联
- ThreadLocal 与 Request 和 Session 之关联
- 用threadLocal管理 session
- Session管理之ThreadLocal
- ThreadLocal管理Session
- 利用Spring随时随地获得Request和Session
- 利用Spring随时随地获得Request和Session
- 利用Spring随时随地获得Request和Session
- 利用Spring获得Request和Session
- 利用Spring随时随地获得Request和Session
- 利用过滤器来实现session超时,和权限管理
- struts2 中request和session中的管理
- request和ThreadLocal
- 在Eclipse中使用Maven方式编译Kettle 8.0
- angular基础
- 17101101_Windows系统通过FillZilla上传文件到linux系统方法
- Mongoose OS 的mos命令
- VS 2013 VS 2015的卸载方法& VS 2015社区版的安装失败记录
- 利用ThreadLocal管理request和session以及用户信息,实现 Use anywhere
- 《Effective C++》条款06
- jcenter 快速集成 极光推送 具体步骤
- iOS 开发转战ASP.NET 的过程
- volatile用法
- Linux下基于V4L2 USB Camera操作
- Eclipse插件TFS的使用 类似SVN 但是功能更强大,适应就很好用,能防止冲突使用文档在资源中
- mongodb 启动报错的几种情况与办法
- web网站架构演变过程