サーバー部品
web.xml
CharacterEncodingShiftJISFilterで特定のurlをShift-JISで処理する
<?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">
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<context-param>
<param-name>contextClass</param-name>
<param-value>
org.springframework.web.context.support.AnnotationConfigWebApplicationContext
</param-value>
</context-param>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>example.config.AppConfig</param-value>
</context-param>
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>
org.springframework.web.filter.CharacterEncodingFilter
</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter>
<filter-name>CharacterEncodingShiftJISFilter</filter-name>
<filter-class>
org.springframework.web.filter.CharacterEncodingFilter
</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>Shift-JIS</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingShiftJISFilter</filter-name>
<url-pattern>/echo_shiftjis</url-pattern>
</filter-mapping>
<servlet>
<servlet-name>app</servlet-name>
<servlet-class>
<!-- DispatcherServletクラスをサーブレットコンテナに登録します. -->
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<init-param>
<!-- contextClassパラメータにAnnotationConfigWebApplicationContextを指定します. -->
<param-name>contextClass</param-name>
<param-value>
org.springframework.web.context.support.AnnotationConfigWebApplicationContext
</param-value>
</init-param>
<init-param>
<!-- contextConfigLocationパラメータに作成したコンフィギュレーションクラスを指定します. -->
<param-name>contextConfigLocation</param-name>
<param-value>example.config.WebMvcConfig</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<!-- DispatcherServlet を使用してリクエストをハンドリングするURLのパターンを定義します. -->
<servlet-name>app</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<jsp-config>
<jsp-property-group>
<url-pattern>*.jsp</url-pattern>
<page-encoding>UTF-8</page-encoding>
<include-prelude>/WEB-INF/include.jsp</include-prelude>
</jsp-property-group>
</jsp-config>
</web-app>
■index.jsp
<html>
<body>
<ul>
<li><a href="<c:url value='/echo' />">エコーアプリケーションへ</a></li>
<li><a href="<c:url value='/echo_shiftjis' />">エコー(Shift-JIS)アプリケーション</a></li>
</ul>
</body>
</html>
■input.jsp(UTF-8用)
<html>
<body>
<h2>入力画面</h2>
<form:form modelAttribute="echoForm">
<div>テキストを入力してください :</div>
<div>
<form:input path="text" />
<form:errors path="text" />
</div>
<div>
<form:button>送信</form:button>
</div>
</form:form>
</body>
</html>
■input_shiftjis.jsp(Shift-JIS用)
リクエスト元とリクエスト先の文字コードが異なる場合の対応
UTF-8のページでShift-JISのページにpostするので「accept-charset=”shift_jis”」を追加
<html>
<body>
<h2>入力画面(accept-charset="shift_jis")</h2>
<form:form modelAttribute="echoForm" accept-charset="shift_jis">
<div>テキストを入力してください :</div>
<div>
<form:input path="text" />
<form:errors path="text" />
</div>
<div>
<form:button>送信</form:button>
</div>
</form:form>
</body>
</html>
EchoController.java(UTF-8用)
package example.app;
import javax.validation.Valid;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
@Controller
@RequestMapping("echo")
public class EchoController {
@RequestMapping(method = RequestMethod.GET)
public String viewInput(Model model) {
EchoForm form = new EchoForm();
model.addAttribute(form);
return "echo/input";
}
@RequestMapping(method = RequestMethod.POST)
public String echo(@Valid EchoForm form, BindingResult result) {
if (result.hasErrors()) {
return "echo/input";
}
return "echo/output";
}
}
EchoShiftJisController.java(Shift-JIS用)
package example.app;
import javax.validation.Valid;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
@Controller
@RequestMapping("echo_shiftjis")
public class EchoShiftJisController {
@RequestMapping(method = RequestMethod.GET)
public String viewInput(Model model) {
EchoForm form = new EchoForm();
model.addAttribute(form);
return "echo/input_shiftjis";
}
@RequestMapping(method = RequestMethod.POST)
public String echo(@Valid EchoForm form, BindingResult result) {
if (result.hasErrors()) {
return "echo/input";
}
return "echo/output_shiftjis";
}
}
■Client部品
HttpURLConnectionMain.java
package http.client;
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
public class HttpURLConnectionMain {
public static void main(String[] args) throws Exception {
String urlstrUTF8 = "http://192.168.0.7:8080/CardAuthStub/echo";
String urlstrShiftJIS = "http://192.168.0.7:8080/CardAuthStub/echo_shiftjis";
String text = "テスト タロウ";
String postDataUTF8 = "text=" + URLEncoder.encode(text, "UTF-8");
String postDataShiftJIS = "text=" + URLEncoder.encode(text, "Shift-JIS");
post(urlstrShiftJIS, postDataShiftJIS, "UTF-8");
}
private static void post(String urlstr, String postData, String charset) throws IOException {
URL url = new URL(urlstr);
try {
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("POST");
conn.setDoOutput(true);
conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded; charset=" + charset);
// conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
conn.setRequestProperty("Content-Length", Integer.toString(postData.length()));
conn.setUseCaches(false);
conn.setConnectTimeout(1000);
conn.setReadTimeout(60000);
DataOutputStream dos = new DataOutputStream(conn.getOutputStream());
dos.writeBytes(postData);
BufferedReader br = new BufferedReader(new InputStreamReader(
conn.getInputStream()));
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
■HttpURLConnectionMain2.java
package http.client;
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
public class HttpURLConnectionMain2 {
public static void main(String[] args) throws Exception {
String urlstrUTF8 = "http://192.168.0.7:8080/CardAuthStub/echo";
String urlstrShiftJIS = "http://192.168.0.7:8080/CardAuthStub/echo_shiftjis";
String text = "テスト タロウ";
String postDataUTF8 = "text=" + URLEncoder.encode(text, "UTF-8");
String postDataShiftJIS = "text=" + URLEncoder.encode(text, "Shift-JIS");
// post(urlstrUTF8, postDataUTF8 ,"UTF-8");
// post(urlstrUTF8, postDataShiftJIS ,"UTF-8");
// post(urlstrShiftJIS, postDataUTF8 ,"Shift-JIS");
post(urlstrShiftJIS, postDataShiftJIS, "UTF-8");
// post(urlstrShiftJIS, postDataShiftJIS ,"Shift-JIS");
}
private static void post(String urlstr, String postData, String charset) throws IOException {
URL url = new URL(urlstr);
try {
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("POST");
conn.setDoOutput(true);
conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded; charset=" + charset);
// conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
conn.setRequestProperty("Content-Length", Integer.toString(postData.length()));
conn.setUseCaches(false);
conn.setConnectTimeout(1000);
conn.setReadTimeout(60000);
DataOutputStream dos = new DataOutputStream(conn.getOutputStream());
dos.writeBytes(postData);
// 接続を開始する
conn.connect();
// サーバーから受信したメッセージのヘッダー部分を取得します。
Map<String,List<String>> headers = conn.getHeaderFields();
Iterator<?> headerIt = headers.keySet().iterator();
String header = null;
while(headerIt.hasNext()){
String headerKey = (String)headerIt.next();
header += headerKey + ":" + headers.get(headerKey) + "\r\n";
}
System.out.println(header);
// サーバーから受信したメッセージの本文であるBODY部を取得します。
BufferedReader br = new BufferedReader(new InputStreamReader(
conn.getInputStream()));
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
■RestTemplateMain.java
package http.client;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URI;
import java.net.URISyntaxException;
import java.nio.charset.Charset;
import org.springframework.core.io.Resource;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.MediaType;
import org.springframework.http.RequestEntity;
import org.springframework.http.ResponseEntity;
import org.springframework.http.client.SimpleClientHttpRequestFactory;
import org.springframework.http.converter.StringHttpMessageConverter;
import org.springframework.util.CollectionUtils;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.client.RestTemplate;
public class RestTemplateMain {
public static void main(String[] args) {
String charsetUTF8 = "UTF-8";
String charsetShiftJIS = "Shift_JIS";
String urlstrUTF8 = "http://192.168.0.8:8080/CardAuthStub/echo";
String urlstrShiftJIS = "http://192.168.0.8:8080/CardAuthStub/echo_shiftjis";
// postExchange(charsetUTF8, urlstrUTF8);
// postExchange(charsetShiftJIS, urlstrShiftJIS);
//
// postExchangeBinary(charsetUTF8, urlstrUTF8);
postExchangeInputStream(charsetShiftJIS, urlstrShiftJIS);
}
private static void postExchange(String charsetShiftJIS, String urlstrShiftJIS) {
// リクエストパラメタを送信する(文字コード指定)
HttpHeaders paramsHeaders = new HttpHeaders();
paramsHeaders
.setContentType(new MediaType(MediaType.APPLICATION_FORM_URLENCODED, Charset.forName(charsetShiftJIS)));
MultiValueMap<String, String> params = new LinkedMultiValueMap<String, String>();
params.add("text", "テスト タロウ");
RestTemplate client = new RestTemplate(new SimpleClientHttpRequestFactory());
//ボディ変換器の文字変換にレスポンスの文字コードを設定する。
CollectionUtils.findValueOfType(client.getMessageConverters(), StringHttpMessageConverter.class)
.setDefaultCharset(Charset.forName(charsetShiftJIS));
//リクエスト作成
try {
RequestEntity<?> req = new RequestEntity<>(params, paramsHeaders, HttpMethod.POST, new URI(urlstrShiftJIS));
//リクエスト処理(レスポンスの型をStringにするだけ)
ResponseEntity<String> response = client.exchange(req, String.class);
String body = response.getBody();
System.out.println("Headers:" + response.getHeaders());
System.out.println("StatusCode:" + response.getStatusCode());
System.out.println("StatusCodeValue:" + response.getStatusCodeValue());
System.out.println(body);
} catch (URISyntaxException e) {
// TODO 自動生成された catch ブロック
e.printStackTrace();
}
}
private static void postExchangeByte(String charsetShiftJIS, String urlstrShiftJIS) {
// リクエストパラメタを送信する(文字コード指定)
HttpHeaders paramsHeaders = new HttpHeaders();
paramsHeaders
.setContentType(new MediaType(MediaType.APPLICATION_FORM_URLENCODED, Charset.forName(charsetShiftJIS)));
MultiValueMap<String, String> params = new LinkedMultiValueMap<String, String>();
params.add("text", "テスト タロウ");
RestTemplate client = new RestTemplate(new SimpleClientHttpRequestFactory());
//ボディ変換器の文字変換にレスポンスの文字コードを設定する。
CollectionUtils.findValueOfType(client.getMessageConverters(), StringHttpMessageConverter.class)
.setDefaultCharset(Charset.forName(charsetShiftJIS));
//リクエスト作成
try {
RequestEntity<?> req = new RequestEntity<>(params, paramsHeaders, HttpMethod.POST, new URI(urlstrShiftJIS));
//リクエスト処理(レスポンスの型をStringにするだけ)
ResponseEntity<byte[]> response = client.exchange(req, byte[].class);
byte[] body = response.getBody();
System.out.println("Headers:" + response.getHeaders());
System.out.println("StatusCode:" + response.getStatusCode());
System.out.println("StatusCodeValue:" + response.getStatusCodeValue());
System.out.println(new String(body));
} catch (URISyntaxException e) {
// TODO 自動生成された catch ブロック
e.printStackTrace();
}
}
private static void postExchangeInputStream(String charsetShiftJIS, String urlstrShiftJIS) {
// リクエストパラメタを送信する(文字コード指定)
HttpHeaders paramsHeaders = new HttpHeaders();
paramsHeaders
.setContentType(new MediaType(MediaType.APPLICATION_FORM_URLENCODED, Charset.forName(charsetShiftJIS)));
MultiValueMap<String, String> params = new LinkedMultiValueMap<String, String>();
params.add("text", "テスト タロウ");
RestTemplate client = new RestTemplate(new SimpleClientHttpRequestFactory());
//ボディ変換器の文字変換にレスポンスの文字コードを設定する。
CollectionUtils.findValueOfType(client.getMessageConverters(), StringHttpMessageConverter.class)
.setDefaultCharset(Charset.forName(charsetShiftJIS));
//リクエスト作成
try {
RequestEntity<?> req = new RequestEntity<>(params, paramsHeaders, HttpMethod.POST, new URI(urlstrShiftJIS));
//リクエスト処理(レスポンスの型をStringにするだけ)
ResponseEntity<Resource> response = client.exchange(req, Resource.class);
InputStream responseInputStream;
try {
responseInputStream = response.getBody().getInputStream();
}
catch (IOException e) {
throw new RuntimeException(e);
}
System.out.println("Headers:" + response.getHeaders());
System.out.println("StatusCode:" + response.getStatusCode());
System.out.println("StatusCodeValue:" + response.getStatusCodeValue());
// サーバーから受信したメッセージの本文であるBODY部を取得します。
BufferedReader br = new BufferedReader(new InputStreamReader(responseInputStream));
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
} catch (URISyntaxException | IOException e) {
// TODO 自動生成された catch ブロック
e.printStackTrace();
}
}
}