Java 过滤器Filter,Java Filter 不拦截某些请求
Java 过滤器支持Ajax请求
================================
©Copyright 蕃薯耀 2018年10月19日
http://fanshuyao.iteye.com/
一、Java权限过滤器,如登录过滤
增加了配置文件,配置不拦截的请求,可以自定义不拦截的规则,有三种:
1、不拦截包含/service/的请求(*/service/*)
2、不拦截以aaa/bbb/开头的请求(aaa/bbb/*)
3、不拦截以/ccc/aa.action结尾的请求(*/ccc/aa.action)
过滤器代码如下:
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.util.HashSet; import java.util.Set; 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.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.lang.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; public class SessionFilter implements Filter { protected final Log logger = LogFactory.getLog(SessionFilter.class); private Set<String> unFilterSet = new HashSet<String>(); @Override public void init(FilterConfig config) throws ServletException { InputStream in = null; BufferedReader reader = null; try { in = SessionFilter.class.getClassLoader().getResourceAsStream("sessionUnFilter.properties"); if(in != null){ reader = new BufferedReader(new InputStreamReader(in)); String lineText = null; logger.info("=====不拦截的匹配规则有:"); while((lineText = reader.readLine()) != null){ if(!StringUtils.isBlank(lineText) && (!lineText.trim().startsWith("#"))){//过滤掉空行和注释行 logger.info("=====" + lineText); unFilterSet.add(lineText); } } } } catch (Exception e) { e.printStackTrace(); } finally{ if(reader != null){ try { reader.close(); } catch (IOException e) { e.printStackTrace(); } } if(in != null){ try { in.close(); } catch (IOException e) { e.printStackTrace(); } } } logger.info("SessionFilter init()"); } @Override public void destroy() { logger.info("SessionFilter destroy()"); } /** * 如果请求链接符合不拦截的匹配,返回true * @param unFilterSet * @param requestURI * @return */ public boolean isPass(Set<String> unFilterSet, String requestURI){ logger.info("=====requestURI = "+requestURI); if(unFilterSet != null && unFilterSet.size() > 0){ for (String unFilterUri : unFilterSet) { if(!StringUtils.isBlank(unFilterUri)){ unFilterUri = unFilterUri.trim(); if(unFilterUri.equals(requestURI)){ return true; }else if(unFilterUri.startsWith("*") && unFilterUri.length() > 1 && unFilterUri.endsWith("*")){ String text = unFilterUri.substring(1, (unFilterUri.length() - 1)); //logger.info("=====contains text = " + text); if(requestURI.contains(text)){ return true; } }else if(unFilterUri.startsWith("*") && !unFilterUri.endsWith("*")){ String text = unFilterUri.substring(1, (unFilterUri.length())); //logger.info("=====endsWith text = " + text); if(requestURI.endsWith(text)){ return true; } }else if(!unFilterUri.startsWith("*") && unFilterUri.endsWith("*")){ String text = unFilterUri.substring(0, (unFilterUri.length() - 1)); //logger.info("=====startsWith text = " + text); if(requestURI.startsWith(text)){ return true; } } } } } return false; } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain) throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest) servletRequest; HttpServletResponse res = (HttpServletResponse) servletResponse; boolean isAjaxRequest = false;//判断是否Ajax请求 if(!StringUtils.isBlank(req.getHeader("x-requested-with")) && req.getHeader("x-requested-with").equalsIgnoreCase("XMLHttpRequest")){ isAjaxRequest = true; } UserInfo userInfo = null; try { userInfo = SecurityExtApi.getUserInfo(req); } catch (GeneralFailureException e) { e.printStackTrace(); } if(userInfo != null && !StringUtils.isBlank(userInfo.getUserID())){ chain.doFilter(req, res); }else{ String requestURI = req.getRequestURI(); //logger.info("=====requestURI = "+requestURI); if(requestURI.endsWith(".js") || requestURI.endsWith(".css") || requestURI.endsWith(".png") || requestURI.endsWith(".jpg") || requestURI.endsWith(".jpeg") || requestURI.endsWith(".gif") || requestURI.endsWith(".ico")){ chain.doFilter(req, res); return; }else if(isPass(unFilterSet, requestURI)){ chain.doFilter(req, res); return; }else{ String msg = "登录已失效,请刷新页面或重新登录"; logger.info("=====" + msg); if(isAjaxRequest){//Ajax请求结果处理 res.setContentType("application/json;charset=GBK"); res.setCharacterEncoding("GBK"); res.setHeader("error_code", "-999"); res.setHeader("error_msg", "The login is timeout, please login again!"); throw new RuntimeException(msg);//需要增加Ajax异常处理js全局配置文件ajax.config.js }else{ res.sendRedirect("/"); } } } } }
不拦截请求配置文件(sessionUnFilter.properties)如下:
#配置说明: #*/services/* :不拦截包含/services/路径的 #/aa/startwith/* :不拦截以/aa/startwith/开头的 #*/endwith/end.jsp :不拦截以/endwith/end.jsp结尾的 /pro_name/aaa/login_local.jsp /pro_name/bbb/ccc.action */services/*
Ajax请求处理需要增加一个js的全局处理配置文件(全部内容见附件):
$(document).ajaxError(function(event,XHR){ var error_code = XHR.getResponseHeader("error_code"); var error_msg = XHR.getResponseHeader("error_msg"); if(error_code != null && error_code != undefined){ if("-999" == error_code){ error_msg = "异常信息:登录已失效,请重新登录或刷新页面"; }else{ error_msg = "异常信息:"+ error_msg; } error_code = "异常代码:"+error_code; var error_tip = error_code +"<p>" + error_msg; top.$.messager.alert('异常提示:',error_tip,'error'); } });
================================
©Copyright 蕃薯耀 2018年10月19日
http://fanshuyao.iteye.com/
相关推荐
struts2在struts2.xml里配置拦截器可以过滤到指定的url的请求,但是对于ajax的请求确是过滤不了,比如说sesion超时或某些页面有权限控制的,通过ajax的请求时系统会报错最近在解决此类问题时碰上了找了不少资料,...
Ajax允许我们在不刷新整个页面的情况下与服务器进行通信,提高用户体验。然而,当用户未登录或者会话过期时,需要将他们重定向到登录页面。本文将详细介绍如何利用Ajax重写方法配合后台Filter来实现这种情况下的状态...
4. **FileFilter.java**:这个名字可能表示一个过滤器(Filter),在Java Web中,过滤器用于拦截请求,可以实现诸如权限检查、日志记录等功能。在这个场景下,FileFilter可能用于检查用户是否有权下载特定的文件,...
Ajax请求和Filter配合案例解析: 在Web开发中,Ajax技术被广泛应用于实现异步数据交互,而Filter则是一种用于过滤请求和响应的组件。当两者结合在一起工作时,可以实现诸如防止SQL注入等安全措施。本文将详细介绍一...
Shiro 提供了 Filter(过滤器)机制,通过配置可以在 Web 应用的入口处拦截请求,进行权限验证。默认情况下,当用户无权访问某个资源时,Shiro 会重定向到一个预设的错误页面。但如果我们希望对 AJAX 请求做出特殊...
Filter则可以用来拦截和处理请求,为实现Ajax功能提供便利。 对于Java框架的应用,可能涵盖Spring、Struts、JSF(JavaServer Faces)等。Spring框架以其强大的依赖注入和面向切面编程能力,简化了Web应用的开发,其...
Java Servlet API中的Filter接口允许开发者在请求到达Servlet之前或之后对请求和响应进行拦截和处理。Filter可以用来实现如登录验证、内容编码转换、日志记录等功能。在实际应用中,多个Filter可以通过配置web.xml...
以下是一个简单的Java Spring Filter实现,用于判断和处理AJAX请求: ```java import javax.servlet.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import ...
Tomcat作为一款广泛使用的Java Web服务器,提供了一种方式来处理跨域请求,这就是我们今天要讨论的“cors-filter”jar包。 标题中的“cors-filter-1.7.jar”,“cors-filter-2.5.jar”和“cors-filter-2.10.jar”是...
在Java Web开发中,Servlet Filter是Java Servlet API提供的一种机制,用于在请求到达目标Servlet之前或之后进行拦截处理。Web12 Filter可以理解为一个特定版本或场景下的过滤器技术。过滤器的主要任务包括数据...
在本教程中,提到了使用axios库发送Ajax请求,这通常涉及创建XMLHttpRequest对象或使用现代浏览器支持的fetch API,向服务器发送GET或POST请求,接收JSON格式的响应数据。Fastjson是Java中常用的JSON库,可以方便地...
在Java Web开发中,"过滤器(Filter)"和"AJAX(Asynchronous JavaScript and XML)"是两个关键的技术概念,它们在构建高效、交互性强的Web应用中扮演着重要角色。下面将详细阐述这两个技术及其在实际应用中的结合。...
`cors-filter-1.7` 版本可能是针对Tomcat或其他Java Web容器的一个自定义过滤器实现,用于支持ArcGIS Server的跨域请求。 ArcGIS Server 是Esri公司提供的一个强大的地理信息系统(GIS)服务平台,它可以部署在...
`cors-filter-1.7.1.jar`提供了处理跨域请求的过滤器,而`java-property-utils-1.9.1.jar`可能用于读取和处理配置文件。 **三、配置CORS Filter** `web.xml`是Java Web应用的部署描述符,其中的拦截器配置文件...
在Java中,我们可以使用过滤器(Filter)来处理CORS请求。例如,`cors-filter-1.7.jar`是一个实现CORS过滤器的库,它可以帮助我们方便地配置和管理跨域策略。这个过滤器会在请求到达目标资源之前拦截请求,检查其...
CORS Filter基于Java Servlet规范,可以拦截HTTP请求并添加适当的CORS响应头,允许来自不同源的请求访问服务器资源。这个过滤器的核心在于设置Access-Control-Allow-Origin、Access-Control-Allow-Methods、Access-...
在 Java Web 开发中,Filter 是一种组件,可以拦截请求和响应,进行预处理和后处理。在登录功能中,我们可以创建一个 Filter,检查每个请求是否已登录。如果用户未登录,Filter 将重定向到登录页面,确保只有登录的...
5. **Servlet和Filter**:在Java Web应用中,Servlet是处理HTTP请求的主要组件,而Filter则可以用来拦截、修改或转发请求和响应。 6. **jQuery和AJAX**:虽然可以纯JavaScript编写AJAX代码,但jQuery库提供了简单...
在Web开发中,跨域问题是一项常见的挑战,尤其是在进行AJAX请求时。"过滤器"和"拦截器"是两种常用的解决策略,本篇将详细解释如何使用它们处理跨域CORS(Cross-Origin Resource Sharing)。 首先,让我们理解什么是...