关于过滤器的一点小问题

关于过滤器的一点小问题

package filter;

import java.io.IOException;
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;

public class DeviceAdapterFilter implements Filter{

  @Override
  public void destroy() {
    // TODO Auto-generated method stub
    
  }

  @Override
  public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
      throws IOException, ServletException {
    // TODO Auto-generated method stub
    HttpServletRequest req = (HttpServletRequest)request;
    HttpServletResponse res = (HttpServletResponse)response;
    String uri =req.getRequestURI();
    System.out.println("uri:  " + uri);
    if(uri.startsWith("/desktop") || uri.startsWith("/mobile")) {
      chain.doFilter(request, response);
    }else {
       String header  = req.getHeader("user-agent").toLowerCase();
       String targetURI = "";
       if(header.indexOf("android") != -1 || header.indexOf("iphone") != -1) {
         targetURI = "/mobile" + uri;
         System.out.println("target uri :  " + targetURI);
         res.sendRedirect(targetURI);
       }else {
         targetURI = "/desktop" + uri;
         System.out.println("target uri :  " + targetURI);
         res.sendRedirect(targetURI);

       }
    }

    
  }

  @Override
  public void init(FilterConfig arg0) throws ServletException {
    // TODO Auto-generated method stub
    
  }

}
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
  <display-name>filter-chain</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
    <filter>
        <filter-name>device-adapter</filter-name>
        <filter-class>filter.DeviceAdapterFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>device-adapter</filter-name>
        <url-pattern>*.html</url-pattern>
    </filter-mapping>
</web-app>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8 ">
<title>Insert title here</title>
</head>
<body>
<img alt="" src="/images/mobile.jpg" style="width:100%">

</body>
</html>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Insert title here</title>
</head>
<body>
<img alt="" src="/images/desktop.jpg">

</body>
</html>

这是我复现老师的代码,我发现如果在页面里面输入http://localhost/mobile/ 那么过滤器是可以捕捉到uri的

uri:  /mobile/, 但是假如我输入 http://localhost/mobile/   那么过滤器将不会捕捉到任何东西? 但是页面可以正常跳转,问下这个是什么原因呢? 

正在回答

登陆购买课程后可参与讨论,去登陆

2回答

同学你好,测试同学的代码并没有出现同学所说的问题。

这里猜测如果是访问 http://localhost/mobile/ ,会访问某个html页面,配置的过滤器对html进行拦截,跳转到过滤器会输出uri。

如果访问路径是 http://localhost/mobile  ,会访问某个servlet,不访问html页面,就不会被拦截。

祝:学习愉快~

好帮手慕小尤 2020-07-18 15:29:23

同学你好,1. 当进入到此过滤器中,就会输出获取到的uri所以当输入http://localhost/mobile/ 时,可以获取到内容

2. 同学是输入 http://localhost/没有获取到uri吗?如果是,则因没有相关路径,所以没有获取到内容。

3. 可以正常跳转路径,是因在路径中没有/desktop或/mobile时,会运行else中代码,重新拼接targetURI进行重定向,所以可以正常跳转。

如果我的回答解决了你的疑惑,请采纳。祝:学习愉快~

  • 提问者 慕前端8369922 #1
    不好意思昨天晚上困了内容输错了一点,我的意思是上面代码运行后 输入 http://localhost/mobile 最后没有“/”, 但是可以正常跳转到http://localhost/mobile/这个页面, 并且过滤器不会捕捉到uri。 http://localhost/desktop 这个也是同理, 就很疑惑为什么不加 "/" 就捕捉不到了,明明设定的条件是*.html
    2020-07-19 01:16:39
  • 提问者 慕前端8369922 #2
    不好意思,我的问题是 如果输入 http://localhost/mobile 最后没有“/", 这样子页面可以正常跳转,但是过滤器就不会捕捉到uri,这个是为什么嗯?
    2020-07-19 01:54:41
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星

相似问题

登录后可查看更多问答,登录/注册

请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师