Invalid username and password.
最近在研究用spring mvc 4.0开发Web应用,Security 部分无疑是重要的一块。于是按照书上(《Spring in Action 第三版》)的说明自己配制了一个小例子试一下。
系统的自带login页面这块很快调通了,可是自定义login页面这块却遇上很大的问题,按照书上的配制,系统总是报错:
"405 Request method'POST' not supported 。"
看来Spring security 4.0和之前的版本配制改变很多呀。
在网上找了许多BLOGS,都指向CSRF配置,于是修改了各种CSRF配置方式,但是都没有任何效果。在这里耽误了两天的时间,折腾得我快失去耐心了。
按照其他文章的步骤反复重建工程,最后发现是login页面的form标签中的action路径有问题,改为下面这样,就可以工作了。
<formaction="${pageContext.request.contextPath}/login"method="post"class="form-horizontal">
之后又遇到CSS文件无法加载问题,在没有启动Security时明明可以正常加载生效,但是启动了Security之后就不生效,而且login页面提交不成功。经过反复测试,原来是
Security.xml文件中少了一段如下代码,限制了对css文件的访问权限,导致问题。
<httppattern="/resources/**"security="none"/>
<http pattern="/**/*.png"security="none"/>
<http pattern="/**/*.jpg"security="none"/>
<http pattern="/**/*.gif"security="none"/>
<http pattern="/**/*.htm*"security="none"/>
<http pattern="/**/*.css" security="none"/>
最终这个小程序调试通过了,自定义的login页面正常工作了,在此基础上可以添加更完整的功能配置。想起为了这些基本的配置而耽误的时间和遇到困难时的挫折,
我想把这个小例子分享在网上,以帮助想要使用Springsecurity 4.0的朋友们。如果能节约大家一点时间,那就值得了。
下面一步步介绍一下这个工程的各个部分:
首先来看工程架构:
这是一个在Eclipse中建立的Maven 工程,名称Doctor,类型选择maven-archetype-webapp。不同版本创建的目录结构与文件稍有不同,请调整。
以下是几个关键性文件,直接拷过来.....
1. pom.xml
既然使用maven,pom.xml必不可少:
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0http://maven.apache.org/maven-v4_0_0.xsd"> 2. web.xml xmlns="http://java.sun.com/xml/ns/javaee"xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> 3. dispatcher-servlet.xml 注意其中的mvc:resources配置必不可少,否则css和其他资源文件无法访问 xmlns:context="http://www.springframework.org/schema/context" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd"> class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 4. doctor-security.xml xmlns:b="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-4.1.xsd http://www.springframework.org/schema/securityhttp://www.springframework.org/schema/security/spring-security-4.0.xsd"> authentication-failure-url="/login?login_error=1"/> 5. HelloWorldController.java package com.doctor; import org.springframework.stereotype.Controller; import org.springframework.ui.ModelMap; importorg.springframework.web.bind.annotation.RequestMapping; importorg.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.DispatcherServlet; @Controller public class HelloWorldController { @RequestMapping("/hello") publicModelAndView helloWorld(){ Stringmessage = "你好,Programmer"; try{ //message=URLEncoder.encode(newString("你好 Programmer"),"utf-8"); } catch(Exceptione) {} System.out.println(message); returnnew ModelAndView("hellopage","message",message); } @RequestMapping(value= "/login", method = RequestMethod.GET) public StringloginPage() { return"login"; } @RequestMapping(value= "/welcome", method = RequestMethod.GET) public Stringwelcome() { return"welcome"; } } 6. index.jsp
7. hellopage.jsp <%@page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<% String path = request.getContextPath(); String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; %>
Message:${message}
8. login.jsp 这个可是重点呀。 <%@page language="java" contentType="text/html;charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <%@taglib prefix="c"uri="http://java.sun.com/jsp/jstl/core"%> <%@taglib prefix="form"uri="http://www.springframework.org/tags/form" %>
Invalid username and password. You have been logged out successfully. HelloBoy!
class="btn btn-block btn-primary btn-default" value="Login">
最后,本文的一些配置来源于这个Blog, http://websystique.com/spring-security/spring-security-4-custom-login-form-annotation-example/.
两个CSS文件如果需要,也请从那里下载吧。