过滤器和拦截器区别代码示例
时间: 2023-09-04 16:16:35 浏览: 53
过滤器和拦截器都是Java Web开发中常用的组件,用于处理HTTP请求和响应。它们的主要区别在于它们在请求处理过程中的位置和功能。
过滤器是在Servlet容器中执行的,它们在请求进入容器时拦截请求,可以对请求进行修改或筛选,然后将请求传递给Servlet或其他过滤器。过滤器可以对请求和响应进行处理,例如压缩响应、设置请求和响应头、字符编码转换等。
以下是一个简单的过滤器示例:
```java
public class MyFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// 过滤器初始化
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
// 对请求进行处理
HttpServletRequest httpRequest = (HttpServletRequest) request;
String requestURI = httpRequest.getRequestURI();
if (requestURI.startsWith("/admin")) { // 如果请求的URI以/admin开头,则需要进行权限检查
HttpSession session = httpRequest.getSession();
if (session == null || session.getAttribute("user") == null) { // 如果未登录,则返回401错误
HttpServletResponse httpResponse = (HttpServletResponse) response;
httpResponse.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Unauthorized");
return;
}
}
// 继续处理请求
chain.doFilter(request, response);
// 对响应进行处理
HttpServletResponse httpResponse = (HttpServletResponse) response;
httpResponse.setHeader("X-Frame-Options", "DENY"); // 设置响应头,禁止页面在iframe中展示
}
@Override
public void destroy() {
// 过滤器销毁
}
}
```
拦截器是在Spring MVC框架中执行的,它们在请求进入Controller之前拦截请求,可以对请求进行处理、修改或筛选。拦截器可以访问Spring上下文中的Bean,也可以拦截异步请求和WebSocket请求。
以下是一个简单的拦截器示例:
```java
public class MyInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// 对请求进行处理
String requestURI = request.getRequestURI();
if (requestURI.startsWith("/admin")) { // 如果请求的URI以/admin开头,则需要进行权限检查
HttpSession session = request.getSession();
if (session == null || session.getAttribute("user") == null) { // 如果未登录,则返回401错误
response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Unauthorized");
return false;
}
}
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
// 对响应进行处理
response.setHeader("X-Frame-Options", "DENY"); // 设置响应头,禁止页面在iframe中展示
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
// 请求完成后的处理
}
}
```