你这里应该是有一个明显错误,多个类映射到同一名字“LoginFilter"
因为登录成功session中有username的数据,所以就放行了
错误页面的话,一般让别人看到也没事,不过如果想实现以上需求的话,可以把servlet里面的请求到fail.jsp改成转发到fail.jsp,然后把过滤器里面配置的fail.jsp参数去掉,这样应该可以实现。
你是过滤的哪一个页面?是不是把login.jsp登录页面也进行过滤了?
加上了就可以和后面的/main.jsp组成绝对完整路径,成为一个url地址,而且重定向是面向全网络,需要完整url才能到其它服务器的服务页面,转发是单个服务内部资源页面的跳转,不需要完整路径。
过滤器是一种机制,就是在执行业务代码之前对请求进行转换或校验,转发和重定向是一种方法,也会在过滤时用到。不能理解过滤器的好处你自己实现下案例中对请求进行是否登陆的测试的例子
过滤器并没有noLogginPaths这个参数, 要是想实现只能在过滤器的初始化时候设置上哪些不要过滤。下面是练习写的一个demo
@WebFilter(urlPatterns = { "*.jsp" },initParams ={@WebInitParam(name = "myNoLoginPaths", value = "/cc.jsp;/dd.jsp") })
public class MyFilter implements Filter {
private FilterConfig config;
@Override
public void destroy() {
}
@Override
public void doFilter(ServletRequest arg0, ServletResponse arg1,
FilterChain arg2) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) arg0;
//判断是否需要拦截
boolean needFilte = true;
//获取 不拦截的路径列表
String noLoginPaths = config.getInitParameter("myNoLoginPaths");
if(noLoginPaths!= null && !"".equals(noLoginPaths)){
String[] strings = noLoginPaths.split(";");
for (String tempUrl : strings) {
if(request.getRequestURI().indexOf(tempUrl)!=-1 ){
needFilte = false;
break;
}
}
}
if(needFilte){
//具体的拦截处理逻辑
System.out.println("过滤器处理业务"+request.getRequestURI());
}
arg2.doFilter(arg0, arg1);
}
@Override
public void init(FilterConfig arg0) throws ServletException {
config = arg0;
}
}
request.getContextPath()拿到的是项目的根路径
你要非要这样也可以的,只是原本要在servlet中传入的数据要在过滤器里传,之后才能判断表单是否为空。考虑到过滤器的作用,和可能带来的麻烦。这样不合适。
这2个服务间有相互的调用吧
用户提交用户名是放在request对象里面 这段代码是检查session对象中是否为空,也就是是否登录了。
默默的向你说声,你这发错地方了,应该是回答或者笔记吧!
通过过滤器filter设置。
都不知道你在问什么
把你的验证码的servlet也添加进去就可以了
可以直接用<%=session.getAttribute("username") %>
感觉你的web.xml中的<url-pattern>中的参数写的有问题
肯定是你的username这个参数的问题
<filter-mapping>
<filter-name>firstFilter</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
因为如果不添加fail.jsp,输入错误的用户名和密码由于session里面没有提交过来的用户名,所以会跳转到login.jsp,而不会跳转到fail.jsp
肯定啊,你输入正确密码后,需要跳转到登陆成功页面,如果过滤了,那不是白输入了
<filter>
<filter-name>CharactorFilter</filter-name>
<filter-class>com.lyq.CharactorFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharactorFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
我算弄明白了,注解的路径不对urlPatterns={"/LoginServlet"}改成urlPatterns={"/servlet/LoginServlet"}
如何将fail.jsp也过滤掉?
getContextPath()获取的是URL。
HttpServletRequest是ServletRequest的子类。
可能是login.jsp里面 表单的 action的路径写错了