Avoid direct access JSP with Spring Controller
公司所找的外包廠商, 在撰寫前段AP時,為了方便都會將頁面寫在 webcontent 下。
client端可以直接在url key入 http://ip:port/apllication_name/xxx.jsp直接訪問。
統整後的解法如下:
1. 將jsp頁面放在WEB-INF下,即可避免client端直接於url訪問。
2. 使用Spring MVC機制導向該頁
首先, 先建立一個類別 WebConfig 繼承 WebMvcConfigurerAdapter。
並於上方寫下@ComponentScan("你要掃描程式碼來源的package") →這會影響spring去找尋controller、interceptor...等實作類別的路徑,在此我們寫我們程式碼存在的同一層下的路徑com.spring.tku。
撰寫方法viewResolver,先告訴spring,當client端要求頁面時,要到哪個位置去找。
設定 ViewResolver 類別,setPrefix("/WEB-INF/子資料夾名稱"); setSuffix(".你的頁面副檔名");。
接著,有兩種方法。
第一種, 繼承抽象類別 WebMvcConfigurerAdapter,覆寫 addViewControllers 方法。
並加入程式碼 registry.addViewController("/於url輸入的英文").setViewName("欲導向的頁面英文");。
第二種, 使用spring導向controller的方法,做導向jsp的呼叫。
@RequestMapping("/sample") -> 代表於url輸入 http://localhost:8080/spring_ryuichi/sample。
return "sample" -> 代表會從 WEB-INF/view(前面有設定) 找出sample.jsp回傳。
@ComponentScan("com.spring.tku")
public class WebConfig extends WebMvcConfigurerAdapter {
/**
* This will set up the basic support we need for an MVC project
* such as registering controllers and mappings, type converters, validation support
* message converters and exception handling.
*/
@Override
public void addViewControllers(ViewControllerRegistry registry) {
/**
* we can register view controllers that create a direct mapping between the URL and the view name using the ViewControllerRegistry.
* This way, there’s no need for any Controller between the two
* 意即, 在此註冊路徑mapping, 於畫面上要取改jsp頁面時, 不需要額外寫controller去控制導向該頁
*/
//eg. 設定此行, 要access WEB-INF/view下的index.jsp, 於畫面上打 http://localhost:8080/spring_ryuichi/
//他就會自動導向該頁面 index.jsp
registry.addViewController("/").setViewName("index");
//eg. 要access WEB-INF/view下的testtuturu.jsp, 於畫面上打 http://localhost:8080/spring_ryuichi/tuturu
//他就會自動導向該頁面 testtuturu.jsp
registry.addViewController("/tuturu").setViewName("testtuturu");
}
@Bean
public ViewResolver viewResolver() {
InternalResourceViewResolver bean = new InternalResourceViewResolver();
/**
* we’ve registered a ViewResolver bean that will return .jsp views from the /WEB-INF/view directory
*/
//輸入http://localhost:8080/spring_ryuichi/sample時, 會自動回傳WEB-INF/view下的sample.jsp
bean.setPrefix("/WEB-INF/view/");
bean.setSuffix(".jsp");
return bean;
}
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/static/**").addResourceLocations("/static/");//可直接在url上access的資源
registry.addResourceHandler("/*").addResourceLocations("/");//增加此行使其可以讀webcontent下的靜態資源
//registry.addResourceHandler("/view/**").addResourceLocations("/WEB-INF/view/");//增加此行使其可以讀WEB-INF/view下的東西
}
}
@Controller
@ComponentScan("com.spring.tku")
public class TkuController {
private static Logger logger = Logger.getLogger(TkuController.class);
@RequestMapping("/sample")
public String sample() {
logger.info("進入Sample Controller");
return "sample";
}
}
3.結果