如何在过滤器中获取请求的参数及过滤器如何注入bean

1:过滤器中使用bean:因为过滤器是Tomcat容器不受spring的管理所以不能用注解直接注入。我们可以通过下面方式注入:

WebApplicationContext wac = ContextLoader.getCurrentWebApplicationContext();//通过ContextLoader获取上下文

    ILoginService loginService = (ILoginService)wac.getBean("loginService");//通过上下文获取bean

如果想在过滤器中获取bean则可以通过spring的代理,如下:

web.xml中配置:

<filter>

<filter-name>DelegatingFilterProxy</filter-name> 

<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>  
<init-param> 
<param-name>targetBeanName</param-name>    
<param-value>singLoginFiler</param-value>  
</init-param>  
<init-param>    
<param-name>targetFilterLifecycle</param-name>    
<param-value>true</param-value>  
</init-param>
</filter>
<filter-mapping> 
<filter-name>DelegatingFilterProxy</filter-name>  
<url-pattern>/*</url-pattern>
</filter-mapping>

spring中配置bean:

<bean id="singLoginFiler" class="com.yanshang.p2p.usecase.filter.SingLoginFiler"></bean>

然后在SingLoginFiler的过滤器中就可以注入bean了

2:在过滤器中通过request.getParameter();是获取不到请求参数的,如何向获取参数可以通过request.getReader()或request.getInputStream();但request.getReader()老是报reader已开启的错误,应该是某个bean没有序列化的原因,可以使用request.getInputStream()获取,如下同过滤器判断是否已在其它设备登录:

public class SingLoginFiler extends OncePerRequestFilter{
@Override
protected void doFilterInternal(HttpServletRequest request,
HttpServletResponse response, FilterChain filterChain)
throws ServletException, IOException {
Map<String,Object> out = new HashMap<>();
String sid = "";
String singLoginId = "";
String uri = request.getRequestURI();
if(!(uri.contains("index")||uri.contains("appadv")||uri.contains("noOauth2")||uri.contains("index4")||uri.contains("all5"))){
StringBuilder content = new StringBuilder();
ServletInputStream reader = request.getInputStream();
//获取请求参数
byte[] b = new byte[1024];
int lens = -1;
while((lens=reader.read(b))>0){
content.append(new String(b, 0, lens));//将参数放到StringBuilder中
}
reader.close();
String str = content.toString();
if(!StringUtils.isEmpty(str)&&str.length()>2&&str.startsWith("{")){
JSONObject jsonObject = JSONObject.fromObject(str);//将参数转成JSON
if(jsonObject.containsKey("sid")){
sid = jsonObject.getString("sid");
}
if(jsonObject.containsKey("singLoginId")){
singLoginId = jsonObject.getString("singLoginId");
}
}
if(!StringUtils.isEmpty(sid)&&!StringUtils.isEmpty("singLoginId")){
WebApplicationContext wac = ContextLoader.getCurrentWebApplicationContext();
    ILoginService loginService = (ILoginService)wac.getBean("loginService");
String singLogFlag = loginService.getSingLogId(sid);
if(!(StringUtils.isEmpty(singLogFlag)||singLoginId.equals(singLogFlag))){
out.put("code", "999");
out.put("msg", "已在其它设备登录");
JsonUtil.writeJson(response,out);
}
}else{
filterChain.doFilter(request, response);
}
}else{
filterChain.doFilter(request, response);
}
}
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值