项目上有个小需求,要限制访问者的IP,屏蔽未授权的请求。该场景使用过滤器来做再合适不过了。

SecurityFilter.java:

public class SecurityFilter implementsFilter {private Log log = LogFactory.getLog(SecurityFilter.class);private List whitelist = new ArrayList();private List regexlist = new ArrayList();private static final String _JSON_CONTENT = "application/json; charset=UTF-8";private static final String _HTML_CONTENT = "text/html; charset=UTF-8";private static final String _403_JSON = "{'code': '403', 'msg': '访问被拒绝,客户端未授权!'}";private static final String _403_HTML = "

403 Forbidden!


@lichmama

";

@Overridepublic voiddestroy() {

}

@Overridepublic voiddoFilter(ServletRequest servletrequest, ServletResponse servletresponse, FilterChain filterchain)throwsIOException, ServletException {

HttpServletRequest request=(HttpServletRequest) servletrequest;

HttpServletResponse response=(HttpServletResponse) servletresponse;if(isSecurityRequest(request)) {

filterchain.doFilter(request, response);

}else{

log.info("拒绝来自[" + request.getRemoteAddr() + "]的访问请求:" +request.getRequestURI());

response.setStatus(403);if(isAjaxRequest(request)) {

response.setContentType(_JSON_CONTENT);

response.getWriter().print(_403_JSON);

}else{

response.setContentType(_HTML_CONTENT);

response.getWriter().print(_403_HTML);

}

}

}

@Overridepublic void init(FilterConfig filterconfig) throwsServletException {

String allowedIP= filterconfig.getInitParameter("allowedIP");if (allowedIP != null && allowedIP.length() > 0) {for (String item : allowedIP.split(",\\s*")) {//支持通配符*

if (item.contains("*")) {

String regex= item.replace(".", "\\.").replace("*", "\\d{1,3}");

regexlist.add(regex);

}else{

whitelist.add(item);

}

}

}

}/*** 判断当前请求是否来自可信任的地址

*

*@paramrequest

*@return

*/

private booleanisSecurityRequest(HttpServletRequest request) {

String ip=request.getRemoteAddr();for(String item : whitelist) {if(ip.equals(item))return true;

}for(String item : regexlist) {if(ip.matches(item))return true;

}return false;

}/*** 判断请求是否是AJAX请求

*@paramrequest

*@return

*/

private booleanisAjaxRequest(HttpServletRequest request) {

String header= request.getHeader("X-Requested-With");if (header != null && header.length() > 0) {if ("XMLHttpRequest".equalsIgnoreCase(header))return true;

}return false;

}

}

web.xml增加配置:

securityFilter

com.lichmama.webdemo.filter.SecurityFilter

allowedIP

192.168.5.*

securityFilter

/*

尝试访问,结果如下:

*如何在Filter中获取Response的内容?这个问题之前还真没思考过,搜索了下得知如下方法可行:

1.实现一个PrintWriterWrapper,用于替换ServletResponse中的Writer

packagecom.lichmama.webdemo;importjava.io.PrintWriter;importjava.io.Writer;public class PrintWriterWrapper extendsPrintWriter {privateStringBuilder buff;publicPrintWriterWrapper(Writer writer) {super(writer);

buff= newStringBuilder();

}

@Overridepublic void write(inti) {super.write(i);

buff.append(i);

}

@Overridepublic void write(char[] ac, int i, intj) {super.write(ac, i, j);

buff.append(ac, i, j);

}

@Overridepublic void write(char[] ac) {super.write(ac);

buff.append(ac);

}

@Overridepublic void write(String s, int i, intj) {super.write(s, i, j);

buff.append(s, i, j);

}

@Overridepublic voidwrite(String s) {super.write(s);

buff.append(s);

}

@Overridepublic voidflush() {super.flush();

buff.delete(0, buff.length());

}publicString getContent() {returnbuff.toString();

}

}

View Code

2.实现一个ResponseWrapper,用于替换过滤链(FilterChain)中的ServletResponse:

packagecom.lichmama.webdemo;importjava.io.IOException;importjava.io.PrintWriter;importjavax.servlet.http.HttpServletResponse;importjavax.servlet.http.HttpServletResponseWrapper;public class ResponseWrapper extendsHttpServletResponseWrapper {privatePrintWriterWrapper writer;publicResponseWrapper(HttpServletResponse response) {super(response);

}

@Overridepublic PrintWriter getWriter() throwsIOException {if (writer == null)

writer= new PrintWriterWrapper(super.getWriter());returnwriter;

}

}

View Code

3.编写Filter实现获取Response的内容捕获:

packagecom.lichmama.webdemo.filter;importjava.io.IOException;importjavax.servlet.Filter;importjavax.servlet.FilterChain;importjavax.servlet.FilterConfig;importjavax.servlet.ServletException;importjavax.servlet.ServletRequest;importjavax.servlet.ServletResponse;importjavax.servlet.http.HttpServletResponse;importcom.lichmama.webdemo.PrintWriterWrapper;importcom.lichmama.webdemo.ResponseWrapper;public class TestFilter implementsFilter {

@Overridepublic void init(FilterConfig filterconfig) throwsServletException {

}

@Overridepublic voiddoFilter(ServletRequest servletrequest, ServletResponse servletresponse, FilterChain filterchain)throwsIOException, ServletException {

ResponseWrapper responsewrapper= newResponseWrapper((HttpServletResponse) servletresponse);

filterchain.doFilter(servletrequest, responsewrapper);

PrintWriterWrapper writerWrapper=(PrintWriterWrapper) responsewrapper.getWriter();//TODO retrieve content from PrintWriterWrapper

String content =writerWrapper.getContent();

}

@Overridepublic voiddestroy() {

}

}

that's it~

java 屏蔽地域性访问_javaweb利用filter拦截未授权请求相关推荐

  1. java 屏蔽地域性访问_外贸网站屏蔽中国IP访问的多种方法

    大家都知道的原因,做外贸站,国人喜欢研究你的站,还总是帮你进行压力测试-- 首先想到要屏蔽中国IP就会是把中国IP库加入Nginx配置文件中,然后WEB服务器对比IP来达到屏蔽. 在Nginx中加de ...

  2. shiro 同时实现url和按钮的拦截_Shiro是如何拦截未登录请求的(一)

    问题描述 之前在公司搭项目平台的时候权限框架采用的是shiro,由于系统主要面向的是APP端的用户,PC端仅仅是公司内部人员在使用,而且考虑到系统的可用性和扩展性,服务端首先基于shiro做了一些改造 ...

  3. java oauth2搭建_Spring Security 实战干货:OAuth2授权请求是如何构建并执行的

    在Spring Security 实战干货:客户端OAuth2授权请求的入口中我们找到了拦截OAuth2授权请求入口/oauth2/authorization的过滤器OAuth2Authorizati ...

  4. oauth2 java 客户端_Spring Security 实战干货:客户端OAuth2授权请求的入口

    正版spring security实战编程与 54.9元 (需用券) 去购买 > 1. 前言 在Spring Security 实战干货:OAuth2第三方授权初体验一文中我先对OAuth2.0 ...

  5. java web 找回密码_JavaWeb利用邮箱帮用户找回密码

    本文是介绍在一个小的JAVAWeb项目中,利用邮箱帮用户找回密码. 效果展示 需要一个发送邮件的jar包 : javax.mail .jar 1.JSP页面(设置邮箱输入框) pageEncoding ...

  6. php 屏蔽curl访问,php curl指定ip,php curl请求忽略本地host文件,php curl请求跳过本地host文件...

    假如我们使用curl请求一个网站,如果这个网站域名在本地host中也存在,curl默认会请求本地,但是我们可以自己设置解析到哪个ip. (1).设置朋友的博客网站主机和ip,请求测试正确返回远程网站内 ...

  7. shiro 拦截未登录的ajax_Shiro是如何拦截未登录请求的(二)

    /** * 重写父类获取sessionID的方法,若请求为APP或者H5则从请求头中取出token,若为PC端后台则从cookie中获取 * * @param request * @param res ...

  8. Redis未授权访问漏洞复现

    Redis介绍 redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(sor ...

  9. 未授权访问漏洞-Redis未授权访问漏洞

    文章目录 未授权概述 常见未授权访问漏洞 Redis未授权访问 Redis简介 应用场景 Redis 架构 漏洞发现 端口 端口探测 Redis常用命令 Redis历史漏洞 Redis未授权访问 Re ...

最新文章

  1. 一起做激光SLAM:ICP匹配用于闭环检测
  2. BCH综述:数以百万计的商人,更多的代币和冲突的愿景
  3. C/C++程序训练6---歌德巴赫猜想的证明_JAVA
  4. SAP Cloud for Customer Sales Lead明细页面视图的UI模型
  5. java spring 服务器关闭连接_java springboot websocket 服务 服务器主动关闭连接 导致 抛出java.io.EOFException异常...
  6. anychart说明文档
  7. IT部门不应该是一个后勤部门
  8. php request time,php中time()与$_SERVER[REQUEST_TIME]用法区别分析
  9. jqgrid为什么表头和数据之间有间隙_面试官:你看过Redis数据结构底层实现吗?...
  10. 约瑟夫环-单向循环链表
  11. 修改linux引导文件系统,修改/etc/fstab文件加快Linux系统的启动速度
  12. mysql 敏感词_过滤敏感词方式
  13. c++ vs2015 播放音乐_三星s20都取消了耳机孔,1k-2k的播放器会成为直推党新选择吗?...
  14. 论文研究14:Deep Attention Gated Dilated Temporal Convolutional Networks with Intra-Parallel model
  15. Android studio 中使用GeenDao
  16. 数字企业-数字社会-数字中国,统一一套方法论
  17. 关于onCreate(Bundle savedInstanceState, PersistableBundle persistentState)
  18. R语言ggplot2可视化:使用patchwork包将两个ggplot2可视化结果图像垂直堆叠排列进行组合构图(vertically stack the plots)
  19. YOLOX之绘制AP图与损失曲线
  20. HEVC Study Three(基于HM14.0平台)--GOP研究之大揭秘

热门文章

  1. SAP Spartacus checkout页面的入口逻辑
  2. CRM_MESSAGES_DISPLAY debug
  3. What is the usage of excludedParameters
  4. Reuse library debug in Chrome - phase1 init phase
  5. CHIP ID was not passed on from the tile; contact your system administrator
  6. How are SAP ui5 Control Aggregation getter and setter are designed
  7. why SAP Fiori action sheet is created as disabled by default
  8. SAP OData Multiple Origin composition test - Opportunity Creation case
  9. Cloud for Customer里employee视图打开时的渲染逻辑
  10. 列出系统所有未被Business transaction 引用的Products集合