Это очень простой пример использования Spring MVC, REST, Spring Test Framework, Spring и Spring Security с конфигурацией Spring в Java.
Первая часть этого заключается в создании класса конфигурации для веб-приложения. Ниже приведен пример класса конфигурации, который мы будем использовать:
@Configuration
@EnableWebMvc
@ComponentScan(basePackages = {"com.johnathanmsmith.mvc.web"})
@ImportResource("/WEB-INF/spring/applicationContext.xml")
public class WebMVCConfig extends WebMvcConfigurerAdapter
{
private static final Logger logger = LoggerFactory.getLogger(WebMVCConfig.class);
@Bean
public ViewResolver resolver()
{
UrlBasedViewResolver url = new UrlBasedViewResolver();
url.setPrefix("/views/");
url.setViewClass(JstlView.class);
url.setSuffix(".jsp");
return url;
}
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry)
{
logger.debug("setting up resource handlers");
registry.addResourceHandler("/resources/").addResourceLocations("/resources/**");
}
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer)
{
logger.debug("configureDefaultServletHandling");
configurer.enable();
}
@Bean
public SimpleMappingExceptionResolver simpleMappingExceptionResolver()
{
SimpleMappingExceptionResolver b = new SimpleMappingExceptionResolver();
Properties mappings = new Properties();
mappings.put("org.springframework.web.servlet.PageNotFound", "p404");
mappings.put("org.springframework.dao.DataAccessException", "dataAccessFailure");
mappings.put("org.springframework.transaction.TransactionException", "dataAccessFailure");
b.setExceptionMappings(mappings);
return b;
}
}
Затем вы должны настроить файл web.xml для использования вышеуказанного класса конфигурации. Мы делаем это, устанавливая contectConfigLocation в пакет класса конфигурации.
Мы также настроили цепочку фильтра безопасности Spring, указывающую на файл applicationContext.xml, который указывает на my-security.xml.
Ниже приведен код web.xml:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
<servlet>
<servlet-name>Spring MVC Dispatcher Servlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextClass</param-name>
<param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value>
</init-param>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>com.johnathanmsmith.mvc.web.config</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Spring MVC Dispatcher Servlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<context-param>
<description>The Spring configuration files.</description>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/applicationContext.xml</param-value>
</context-param>
<listener>
<description>The Spring context listener.</description>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
</web-app>
Now you can see that we have setup BASIC authentication in the my-security.xml file using Spring security.
<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/security"
xmlns:beans="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/security
http://www.springframework.org/schema/security/spring-security-3.1.xsd">
<global-method-security pre-post-annotations="enabled"/>
<http use-expressions="true">
<intercept-url access="hasRole('ROLE_VERIFIED')" pattern="/json/*"/>
<intercept-url pattern='/*' access='permitAll'/>
<logout logout-success-url="/"/>
<session-management session-fixation-protection="newSession">
<concurrency-control max-sessions="1"/>
</session-management>
<http-basic />
</http>
<authentication-manager>
<authentication-provider>
<user-service>
<user name="test" password="test" authorities="ROLE_VERIFIED"/>
</user-service>
</authentication-provider>
</authentication-manager>
</beans:beans>
Теперь давайте настроим базовый контроллер JSON для отправки данных JSON клиенту:
@Controller
@RequestMapping("/json")
class JSonController
{
private static final Logger logger = LoggerFactory.getLogger(JSonController.class);
private MappingJacksonJsonView jsonView = new MappingJacksonJsonView();
@RequestMapping(value = "/{name}", method = RequestMethod.GET)
@ResponseBody
public User getName(@PathVariable String name, ModelMap model) throws ResourceNotFoundException
{
logger.debug("I am in the controller and got user name: " + name);
/*
Simulate a successful lookup for 2 users, this is where your real lookup code would go
*/
if ("JohnathanMarkSmith".equals(name))
{
return new User("Johnathan Mark Smith", name);
}
if ("Regan".equals(name))
{
return new User("Regan Smith", name);
}
throw new ResourceNotFoundException("User Is Not Found");
}
@RequestMapping(value = "/", method = RequestMethod.GET)
public ResponseEntity<User> getDisplayDefault(ModelMap model)
{
return new ResponseEntity<User>(new User("Johnathan Mark Smith", "JohnathanMarkSmith"), HttpStatus.OK);
}
@ExceptionHandler
public ResponseEntity<ErrorHolder> handle(ResourceNotFoundException e) {
logger.warn("The resource was not found", e);
return new ResponseEntity<ErrorHolder>(new ErrorHolder("Uh oh"), HttpStatus.NOT_FOUND);
}
class ErrorHolder {
public String errorMessage;
@JsonCreator
public ErrorHolder(@JsonProperty("errorMessage") String errorMessage)
{
this.errorMessage = errorMessage;
}
}
}
Это все, что нужно …
Получение проекта и запуск его
Чтобы получить этот проект и запустить его, вам нужно будет выполнить следующие шаги:
Клонировать его с помощью git:
git clone git@github.com:JohnathanMarkSmith/springmvc-rest-secured-test.git cd springmvc-rest-secured-test/ mvn tomcat7:run
Теперь откройте ваш веб-браузер и перейдите на http://127.0.0.1:8080/springmvc-rest-secured-test/
Вот и все. Это работает!
Если у вас есть какие-либо вопросы или комментарии, пожалуйста, напишите мне по адресу john@johnathanmarksmith.com или посетите мой веб-сайт http://JohnathanMarkSmith.com